Как закрыть активность с помощью клавиатуры программного обеспечения после нажатия BACK?

У меня есть Activity, где я хочу, чтобы клавиатура программного обеспечения была анонимной. Как закрыть активность после нажатия BACK, когда клавиатура открыта? Теперь я должен дважды нажать BACK, сначала для закрытия клавиатуры, а затем для завершения Activity.

Ответы

Ответ 1

Как уже упоминалось, onKeyPreIme можно использовать, чтобы поймать кнопку "Назад", но это необходимо переопределить в текстовом представлении, а не в действии.

Здесь полное решение:

Сначала новый класс, полученный из EditText, переопределяет onKeyPreIme и вызывает интерфейс обратного вызова:

// EditTextWithBackButton class
public class EditTextWithBackButton extends EditText
{
    public interface IOnBackButtonListener
    {
        boolean OnEditTextBackButton();
    }

    public EditTextWithBackButton(Context context)
    {
        super(context);
    }

    public EditTextWithBackButton(Context context, AttributeSet attrs)
    {
        super(context, attrs);
    }

    public void setOnBackButtonListener(IOnBackButtonListener l)
    {
        _listener = l;
    }

    IOnBackButtonListener _listener;

    @Override
    public boolean onKeyPreIme(int keyCode, KeyEvent event)
    {
        if (event.getAction()==KeyEvent.ACTION_UP && keyCode==KeyEvent.KEYCODE_BACK)
        {
            if (_listener!=null && _listener.OnEditTextBackButton())
                return false;
        }
        return super.onKeyPreIme(keyCode, event);    //To change body of overridden methods use File | Settings | File Templates.
    }
}

Затем обновите макет:

<com.yournamespace.whatever.EditTextWithBackButton
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:id="@+id/textField"
        />

Затем обновите свою активность внутри OnCreate после setContentView:

((EditTextWithBackButton) findViewById(R.id.textField)).setOnBackButtonListener(new EditTextWithBackButton.IOnBackButtonListener()
{
    @Override
    public boolean OnEditTextBackButton()
    {
        finish();
        return true;
    }
});

Ответ 2

Используйте метод onKeyPreIme (int keyCode, KeyEvent) и проверьте событие KeyEvent.KEYCODE_BACK. Это очень просто, без каких-либо причудливых кодировок.

Ответ 3

Я не верю, что вам понадобится слушатель, setOnBackButtonListener, как это было сначала предложено.

У меня это работает, используя getContext():

public class EditedText extends EditText {

    @Override
    public boolean onKeyPreIme (int keyCode, KeyEvent event){

        if (event.getAction() == KeyEvent.ACTION_UP && keyCode == KeyEvent.KEYCODE_BACK){

            Activity activity = (Activity) getContext();

            activity.finish();

            return true;
        }
        return super.onKeyPreIme(keyCode, event);
    }
}

Обратите внимание, что поскольку событие было обработано, я возвращаю true, а не false, как это было сначала предложено в предыдущих ответах.

Ответ 4

Вы можете использовать следующие

  @Override
public boolean onKeyUp(int keyCode, KeyEvent event) 
    {
    if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) {
           finish();
           return true;
    }
    return super.onKeyUp(keyCode, event);
}

Ответ 5

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) 
    {
    if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) {
           finish();
           return true;
    }
    return super.onKeyDown(keyCode, event);
}

но скажите, что вам нужно приложить еще одно усилие для обнаружения того, что клавиатура открыта, а не используется флагом использования, который может быть использован для принятия решения о возврате или завершении операции.

Ответ 6

установите для параметра "Редактирование текста" значение "OnEditorActionListener" для того, что вы предоставляете мягкую клавиатуру, как показано ниже,

      editText.setOnEditorActionListener(new OnEditorActionListener() {

        public boolean onEditorAction(TextView v, int actionId,
                KeyEvent event) {
            if (event != null
                    && (event.getKeyCode() == KeyEvent.KEYCODE_BACK)) {
                finish();
            }
            return false;
        }
    });