Android - обрабатывать виртуальные и физические события клавиатуры - PullRequest
4 голосов
/ 23 марта 2011

После прочтения ответов на несколько похожих вопросов * я понял, что onKeyListener () не получает события нажатия клавиш с мягкой (виртуальной) клавиатуры. Он получает их только с жесткой (физической) клавиатуры. И обходной путь должен был бы использовать TextWatcher или onKeyboardActionListener. У меня есть следующие вопросы:

(1) Существует ли способ прослушивания нажатий клавиш на любой клавиатуре (мягкой или жесткой), просто внедрив одного слушателя? или в основном один API, который работает для обоих?

(2) TextWatcher или onKeyboardActionListener, в отличие от метода onKey () onKeyListener (), не пропускают представление, которое в данный момент имеет фокус (и в котором пользователь печатает ввод). Итак, как мне получить текущее сфокусированное представление, если бы я использовал TextWatcher или onKeyboardActionListener? Мне нужно это, чтобы иметь возможность установить некоторые свойства в EditText, в которых пользователь вводит свои данные, на основе ввода.

* Смежные вопросы: onKeyListener не работает на виртуальной клавиатуре , onKeyListener не работает с программной клавиатурой (Android) , Android: почему мой OnKeyListener () не вызывается?

Спасибо!

1 Ответ

1 голос
/ 09 апреля 2012

У меня такая же проблема.И предположим, что нет хорошего способа реализовать одно решение для обработки событий программной клавиатуры.Я реализовал onKeyListener() для delete события и TextWatcher для события ключа.

m_edtRecipients.addTextChangedListener(new TextWatcher() {
        boolean bConsumed = false;

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
            if (!bConsumed) {
                RecipientsTextStyle.format(m_edtRecipients.getText(), m_dbProcessor);
            }
        }

        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {
            if (count != 0) {
                bConsumed = true;
                Log.d(TAG, "delete true");
            } else {
                bConsumed = false;
                Log.d(TAG, "erase false");
            }
        }

        @Override
        public void afterTextChanged(Editable s) {

        }
    });

У подхода TextWatcher есть один большой недостаток - вы не можете изменить редактируемый текст, связанный с вашим EditText - это вызовет цикл.Будь осторожен!

...