Возвращение ключевого события на EditText - PullRequest
20 голосов
/ 25 февраля 2011

Как я могу обработать событие нажатия клавиши назад при наборе текста EditText? Когда отображается виртуальная клавиатура и пользователь нажимает клавишу назад, она скрывается. Я хочу обработать это событие, но установка OnKeyListener в EditText не помогает.

Ответы [ 4 ]

69 голосов
/ 25 февраля 2011

Спасибо, Рено. Возможно, это работает, но мне удалось решить это по-другому.

Я переопределил onTeyPreIme EditText (int keyCode, событие KeyEvent). Этот метод перехватывает нажатия клавиш в IME. = D

public boolean onKeyPreIme(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_BACK && 
        event.getAction() == KeyEvent.ACTION_UP) {
            // do your stuff
            return false;
    }
    return super.dispatchKeyEvent(event);
}
15 голосов
/ 25 февраля 2011

Это не работает?

edText.setOnKeyListener(new OnKeyListener()
    {
        public boolean onKey(View v, int keyCode, KeyEvent event)
        {
            if (event.getAction() == KeyEvent.ACTION_DOWN)
            {
                //check if the right key was pressed
                if (keyCode == KeyEvent.KEYCODE_BACK)
                {

                    return true;
                }
            }
            return false;
        }
    });

РЕДАКТИРОВАТЬ :

Хорошо, это удручает. Android не отправляет события IME при закрытии клавиатуры qwerty. Это единственный обходной путь , который мне попался. Я надеюсь, что это работает и для вас.

7 голосов
/ 14 июля 2016

Я понятия не имею, почему это так, но OnKeyListener работает, если вы просто переопределяете onKeyPreIme в своем пользовательском EditText.

customEditText.setOnKeyListener((v, keyCode, event) -> {
            if(event.getAction() == KeyEvent.ACTION_DOWN) {
                switch (keyCode) {
                    case KeyEvent.KEYCODE_BACK:
                        getPresenter().onBackPressed();
                        break;
                }
            }
            return false;
        }); 

@Override
    public boolean onKeyPreIme(int keyCode, KeyEvent event) {
        return super.dispatchKeyEvent(event);
    }
0 голосов
/ 08 апреля 2019

Ни один из других ответов не работал для меня в SearchView, я наконец-то закончил с переопределением метода dispatchKeyEventPreIme(...) в моем пользовательском представлении:

class ImeAwareSearchView @JvmOverloads constructor(
    context: Context?,
    attrs: AttributeSet? = null,
    defStyleAttr: Int = 0
) : SearchView(context, attrs, defStyleAttr) {

    var onKeyEventPreImeListener: OnKeyEventPreImeListener? = null

    override fun dispatchKeyEventPreIme(event: KeyEvent?): Boolean {
        onKeyEventPreImeListener?.onPreImeKeyEvent()
        return false
    }
}

Слушатель выглядит так:

interface OnKeyEventPreImeListener {

    fun onPreImeKeyEvent()
}

И я устанавливаю его во Fragment, чтобы скрыть строку поиска:

search_input.onKeyEventPreImeListener = object: OnKeyEventPreImeListener {
    override fun onPreImeKeyEvent() {
        hideSearchRow()
    }
}

Обратите внимание, что метод dispatchKeyEventPreIme(...) вызывается дважды, поэтому убедитесь, что вы не выполняетеперсонал на мероприятии также дважды.

...