Подтвердить что ты не робот

Вернуть ключевое событие в EditText

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

4b9b3361

Ответ 1

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

Я переопределил EditText onKeyPreIme (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);
}

Ответ 2

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

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. Это единственный обходной путь, с которым сталкивается я. Надеюсь, это сработает и для вас.

Ответ 3

Я понятия не имею, почему это так, но 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);
    }

Ответ 4

SearchView из других ответов не работал для меня в 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(...) вызывается дважды, поэтому убедитесь, что вы не выполняете свою работу по событию также дважды.