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