Android: поймать back в EditText
30 октября 2013
Задачка — отловить нажатие хардварьной кнопки back и OK (или Done) на экранной клавиатуре при фокусе на EditText
. Вроде должно решаться просто...
В Activity ищем наш EditText, вешаем события:
TextView input = (TextView)findViewById(R.id.input); if (input != null) { input.setOnEditorActionListener(this); input.setOnKeyListener(this); }
Далее реализовываем обработчики:
public boolean onEditorAction(TextView textView, int actionId, KeyEvent keyEvent) { if (actionId == EditorInfo.IME_ACTION_DONE){ // делаем свои дела return true; } return false; } public boolean onKey(View view, int keyCode, KeyEvent keyEvent) { if (keyCode == KeyEvent.KEYCODE_BACK) { // делаем свои дела return true; } return false; }
Проверяем. onEditorAction
отработал отлично. А вот onKey
не сработал. Оказывается, по какой-то неведомой причине, событие именно для EditText надо протолкнуть вручную изрядно извратившись. То есть сначала делаем своего наследника EditText с фиксом:
public class EditTextEx extends EditText { public EditTextEx(Context context, AttributeSet attrs) { super(context, attrs); } public EditTextEx(Context context) { super(context); } public EditTextEx(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } @Override public boolean onKeyPreIme(int keyCode, KeyEvent event) { if (event.getKeyCode() == KeyEvent.KEYCODE_BACK) { dispatchKeyEvent(event); return false; } return super.onKeyPreIme(keyCode, event); } }
И после заменяем в наших layout-ах
<EditText android:id="@+id/input" />
на
<com.acme.EditTextEx android:id="@+id/input" />
Вообще разработка под Android начинает чем-то напоминать мне JavaScript под IE... куча псевдо-совместимых версий ОС и девайсов и, как результат, хак на хаке и хаком погоняет...
Комментарии RSS по email OK
вот за это спасибо com.acme.EditTextEx, не знал.
Решил вернуться на яву ?
Нет. Просто у нас в проекте есть Android и iOS.
Хорошая статья, спасибо авторам ! ! !