onKeyListener не работает на виртуальной клавиатуре - PullRequest
23 голосов
/ 26 ноября 2010

Я не понимаю, почему этот кусок кода не работает.Обнаружены только клавиша возврата и возврата.Слушатель не стреляет ни по одному другому ключу.Мое устройство - Nexus One.

Я попытался переопределить метод OnKeyDown активности, и это еще хуже.Единственной обнаруженной кнопкой была аппаратная кнопка возврата.

Я вижу предложение использовать TextWatcher и onTextChanged, хотя в некоторых случаях это может сработать, но это не реальная работаНапример, если текстовое поле пусто, вы не обнаружите, нажмет ли пользователь кнопку BackSpace (Удалить).Так есть идеи?

        TextView txtInput = (TextView)findViewById(R.id.txtInput);
    txtInput.setOnKeyListener(new View.OnKeyListener() {
        @Override
        public boolean onKey(View v, int keyCode, KeyEvent event) {
            makeToast(keyCode + " key pressed");
            return true;
        }
    });

Ответы [ 5 ]

19 голосов
/ 26 ноября 2010

Хорошо.Я наконец понял, как делать то, что я хочу, и я не горжусь этим на Android.

Я пишу серверное / клиентское приложение, где на клиенте я должен открыть SoftKeyboard и отправить нажатые клавиши (символы и клавишу DEL) ... При каждом нажатии клавиши этот символ отправляется на сервер.Если нажата DEL, я посылаю последовательность {BS} на сервер.

Для этого мне пришлось реализовать TextWatcher и onTextChange, который хорошо работает, за исключением ситуации, когда EditText пуст и пользователь нажимает клавишу DEL.Поскольку в EditText нет изменений, нет способа обнаружить нажатие клавиши DEL.

В дополнение к TextWatcher мне пришлось реализовать onKeyListener, который я прикрепил к своему элементу управления EditText.Этот onKeyListener игнорирует все клавиши на SoftKeyboard, кроме DEL и RETURN.Не уверен почему?Может быть, ошибка?

Вот мой код:

    TextView txtInput = (TextView)findViewById(R.id.txtInput);
    txtInput.addTextChangedListener(inputTextWatcher);

    txtInput.setOnKeyListener(new View.OnKeyListener() {
        @Override
        public boolean onKey(View v, int keyCode, KeyEvent event) {
            Log.d(TAG, keyCode + " character(code) to send");
            return false;
        }
    });

и TextWatcher ....

private TextWatcher inputTextWatcher = new TextWatcher() {
    public void afterTextChanged(Editable s) { }
    public void beforeTextChanged(CharSequence s, int start, int count, int after)
        { }
    public void onTextChanged(CharSequence s, int start, int before, int count) {
        Log.d(TAG, s.charAt(count-1) + " character to send");;          
    }
};
4 голосов
/ 26 ноября 2010

Вы сделали одну ошибку здесь.
должно return true, если вы обработали событие. Если вы хотите разрешить обработку события следующим получателем , return false
Вы всегда возвращаете истину

3 голосов
/ 19 марта 2015

Примечание: упоминание типа ввода в вашем тексте редактирования.

<EditText android:id="@+id/select_category" 
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="textCapSentences|textAutoCorrect" >



edittext.setOnEditorActionListener(new OnEditorActionListener() {

            @Override
            public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {

                if ((actionId & EditorInfo.IME_MASK_ACTION) == EditorInfo.IME_ACTION_DONE) {
                    //do something here.
                    return true;
                }
                return false;
            }
        });
2 голосов
/ 07 февраля 2013

Вы пытались использовать определенный подкласс слушателя для этого представления?

У меня была похожая проблема с EditText. Код ниже работал:

private OnKeyListener keyListener = new EditText.OnKeyListener(){

    @Override
    public boolean onKey(View v, int keyCode, KeyEvent event) {
        EditText et = (EditText) v;
        Log.i("APPEVENT", "Key hit: "+ event);
        //...
        return false;
    }

};

Но если я использовал View.OnKeyListener, я записываю только backspace и ввод. Это может быть похожая проблема с TextView. Возможно, слушатели ключа подкласса чувствительны к большему количеству событий для данного подкласса View.

0 голосов
/ 05 января 2011

У нас также была проблема TextWatcher на iPhone - если буфер пуст, клавиатура не отправляет событие del.Мы обошли его, предварительно загрузив буфер клавиатуры с 1000 символов.К счастью, наше приложение скрыло поле редактирования за клавиатурой, поэтому 1000 символов не были видны.Это некрасиво, но работает (если пользователь не нажмет 1000 удалений подряд перед вводом каких-либо данных!)

...