Я использую onKeyListener для получения событий onKey. Он отлично работает с обычной клавиатурой. Но это не работает с мягкой клавиатурой. Я могу получить только событияKey для чисел, а не алфавитов. Есть ли способ обхода решения? Любая помощь будет принята с благодарностью.
OnKeyListener не работает с мягкой клавиатурой (Android)
Ответ 1
Я не верю, что OnKeyListener вообще вызван с помощью программной клавиатуры. Это имеет какое-то отношение к клавиатуре программного обеспечения, являющейся устройством IME, а устройства IME, возможно, являются вещами, отличными от клавиатур. Похоже, что onKeyListener делает практически бесполезным, поскольку он работает только на телефонах с аппаратными клавишами. Недавно я работал над этой проблемой, используя TextWatcher в поле EditText в моей работе вместо использования OnKeyListener.
Ответ 2
onKeyListener отлично работал на Android 1.5 с помощью мягкой клавиатуры
Начиная с Android 1.6 символьные и цифровые клавиши не проходят через событие onKey, но клавиша DEL делает
Срыв
Ответ 3
Это похоже на специфику устройства. Я могу подтвердить, что это работает на Xoom и Acer A100. Однако Samsung Galaxy Tab Plus запускает событие только для кнопок, отличных от символов. (Все устройства, работающие на сотах)
Ответ 4
Это, наверное, глупо, но то, как Android работает на данный момент.
В документации указано, что ключевые события будут распространяться только на аппаратные нажатия клавиш, а не на программное обеспечение.
Производителям устройств на самом деле не поощряется распространять события софт-клавиатурой через прослушиватели клавиш, хотя разработчик полностью соблюдает это или действительно обрабатывает мягкие и жесткие клавиатуры с равными терминами.
Начиная с Android 4.2.2, сама система Android не будет поддерживать ключевые события стоп-сигналов для программных клавиатур вообще, поэтому даже производители не смогут выбрать способ.
Таким образом, единственная надежная опция - реализовать собственную IME (мягкую клавиатуру) и самостоятельно обрабатывать нажатия клавиш.
TextWatcher может использоваться в основном для замены прослушивателей клавиш, однако editText.setText(...); также вызовет события TextWatcher, поэтому, если вас интересуют только введенные ключи, возможно, TextWatcher также не является решением.
Будьте осторожны при использовании TextWatcher с AutocomleteTextView или EditText. Не изменяйте текст в содержимом AutocompleteTextView/EditText из событий TextWatcher, иначе вы, скорее всего, окажетесь в бесконечном цикле событий/прослушивания.
Надеемся, что это поможет прояснить доступные варианты, но, к сожалению, это не дает рабочего решения.
Разочарование того, что Google пропустил этот важный аспект своего интерфейса.
Ответ 5
Я обошел это, поставив слушателя в свой собственный метод и снова вызвав его после первого раза. В onCreate я вызываю setKeyListenerForEnter();
Тогда, здесь метод:
public void setKeyListenerForEnter() {
final EditText search_entry = (EditText) findViewById(R.id.search_entry);
search_entry.setOnKeyListener(new OnKeyListener() {
public boolean onKey(View v, int keyCode, KeyEvent event) {
// If the event is a key-down event on the "enter" button
if ((event.getAction() == KeyEvent.ACTION_DOWN) &&
(keyCode == KeyEvent.KEYCODE_ENTER)) {
getSearchResults(v);
setKeyListenerForEnter();
return true;
}
return false;
}
});
}
Я не уверен, что это лучшее решение, чем обработка самой клавиатуры IME, но это решение.
Ответ 6
setFocusableInTouchMode(true); //Enable soft keyboard on touch for target view
setFocusable(true); //Enable hard keyboard to target view
Пример:
public class CanvasView extends View{
public CanvasView(Context c){
super(c);
//enable keyboard
setOnKeyListener(new KeyBoard());
setFocusable(true);
setFocusableInTouchMode(true);
}
}