Сделать 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;
}
});