Сделать editText потерять фокус на заднем нажатии

В моей деятельности у меня есть поле editText. Когда пользователь нажимает на него, editText получает фокус и появляется клавиатура. Теперь, когда пользователь нажимает кнопку аппаратного возврата на телефоне, клавиатура исчезает, но курсор остается в редакторе, т.е. е. он все еще имеет фокус. Возможно ли, что EditText потеряет фокус при нажатии кнопки "Назад"? Я попытался использовать следующий код, но он не работал:

@Override
public void onBackPressed() {
    vibrator.vibrate(Constants.DEFAULT_VIBRATE_TIME);
    myEditText.clearFocus();
            super.onBackPressed();
}

Ответ 1

Просто добавьте EditText:

public class EditTextV2 extends EditText
{
    public EditTextV2( Context context )
    {
        super( context );
    }

    public EditTextV2( Context context, AttributeSet attribute_set )
    {
        super( context, attribute_set );
    }

    public EditTextV2( Context context, AttributeSet attribute_set, int def_style_attribute )
    {
        super( context, attribute_set, def_style_attribute );
    }

    @Override
    public boolean onKeyPreIme( int key_code, KeyEvent event )
    {
        if ( event.getKeyCode() == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_UP )
            this.clearFocus();

        return super.onKeyPreIme( key_code, event );
    }
}

И в xml просто используйте <yourPackage.EditTextV2> вместо <EditText>.

Примечание. Возможно, вам придется добавлять/удалять конструкторы этого класса в зависимости от минимального API, который вы поддерживаете. Я предлагаю просто добавить их все и удалить те, чьи вызовы super() получают подчеркнутым красным цветом.

Ответ 2

Вы можете сделать еще один из ваших Views настраиваемых, например ImageView. Обязательно сделайте его фокусируемым в сенсорном режиме, используя setFocusableInTouchMode(true) и onResume(), чтобы сделать View до requestFocus().

Также вы можете создать фиктивный View с 0 размерами и выполнить те же действия, описанные выше.

Надеюсь, это поможет.

Ответ 3

Добавьте следующий вид выше, чем ваш EditText:

<LinearLayout
    android:layout_width="0px"
    android:layout_height="0px"
    android:focusable="true"
    android:focusableInTouchMode="true" />

Также, чтобы скрыть клавиатуру, добавьте это в onBackPressed():

((InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE)).hideSoftInputFromWindow(myEditText.getWindowToken(), 0);

Ответ 4

Для тех, кто использует Kotlin и Material Design, вы можете использовать это:

class ClearFocusEditText: TextInputEditText {
    constructor(context: Context) : super(context)
    constructor(context: Context, attrs: AttributeSet) : super(context, attrs)
    constructor(context: Context, attrs: AttributeSet, defStyleAttr: Int) : super(context, attrs, defStyleAttr)

    override fun onKeyPreIme(keyCode: Int, event: KeyEvent?): Boolean {
        if(keyCode == KeyEvent.KEYCODE_BACK) {
            clearFocus()
        }

        return super.onKeyPreIme(keyCode, event)
    }
}

Ответ 5

Это может быть возможным решением:

EditText et;
et.setOnKeyListener(new View.OnKeyListener() {

        @Override
        public boolean onKey(View view, int i, KeyEvent keyEvent) {
            if(i == KeyEvent.KEYCODE_BACK) {
                et.clearFocus();
                return true;
            }
            else return false;
        }
    });