<rmcreative>

RSS

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

  1. №8516
    Justsamter
    Justsamter 30 окт. 2013 г., 5:39:39

    вот за это спасибо com.acme.EditTextEx, не знал.

  2. №8524
    Максим
    Максим 31 окт. 2013 г., 22:16:04

    Решил вернуться на яву ?

  3. №8525
    Sam
    Sam 31 окт. 2013 г., 23:27:38

    Нет. Просто у нас в проекте есть Android и iOS.

  4. №8549
    Степан
    Степан 08 нояб. 2013 г., 19:42:05

    Хорошая статья, спасибо авторам ! ! !

  1. Почта опубликована не будет.

  2. Можно использовать синтаксис Markdown или HTML.

  3. Введите ответ в поле. Щёлкните, чтобы получить другую задачу.