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

OnKeyListener не работает с мягкой клавиатурой (Android)

Я использую onKeyListener для получения событий onKey. Он отлично работает с обычной клавиатурой. Но это не работает с мягкой клавиатурой. Я могу получить только событияKey для чисел, а не алфавитов. Есть ли способ обхода решения? Любая помощь будет принята с благодарностью.

4b9b3361

Ответ 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);
    }
}