Невозможно обнаружить кнопку удаления программной клавиатуры в эмуляторе - PullRequest
0 голосов
/ 03 мая 2018

Я пытаюсь обнаружить кнопку возврата или удаления программной клавиатуры, используя метод ниже. Он отлично работает в физических устройствах, но не работает emulator. Эмулятор может обнаружить все ключевые события (например, кнопка ввода, цифровые кнопки), ожидают кнопку удаления. При нажатии на кнопку удаления в эмуляторе не вызывается ни onKeyDown(), ни dispatchKeyEvent(). В чем может быть проблема?

Цель сделать это:

Я пытаюсь перейти к предыдущим EditText полям, если пользователь нажимает удалить в текущем пустом поле EditText. Вот почему я полагался на метод dispatchKeyEvent().

Я использую Эмулятор Nexus 5X API 25

public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_DEL) {
            Log.e(TAG,keyCode)
        }
        return super.onKeyDown(keyCode, event);
    }

Вот мой макет:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:focusable="true"
        android:hint="Name" />

</RelativeLayout>

Изображение кнопки удаления:

enter image description here

1 Ответ

0 голосов
/ 11 мая 2018

После понимания вашего требования я обнаружил, что onKeyDown и onKeyUp не работают на эмуляторе Nexus 5 API 25, но TextWatcher может служить вашей цели, если вы действительно хотите использовать эмулятор Nexus 5 API 25.

Вкл. Nexus 5X API 26, onKeyDown и onKeyUp работают нормально. Конечно, TextWatcher тоже работает.

Используйте TextWatcher , чтобы обнаружить изменения в тексте внутри EditText, и там вы можете проверить, какая клавиша нажата. Ниже работает код:

    TextWatcher textWatcher = new TextWatcher() {

        public void  beforeTextChanged(CharSequence s, int start, int count, int after){
            if (after < count) {
                Log.d("DELETE_KEY_PRESSED", "beforeTextChanged: ");
            }
        }

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
            if (s.length()>0 && s.subSequence(s.length()-1, s.length()).toString().equalsIgnoreCase("\n")) {
                Log.d("ENTER_KEY_PRESSED", "onTextChanged: ");
            } else if (s.length() == 0) {
                Log.d("DELETE_KEY_PRESSED", "onTextChanged: ");
            }
        }

        @Override
        public void afterTextChanged(Editable s) {

        }
    };

    EditText editText = (EditText) findViewById(R.id.edit);
    editText.addTextChangedListener(textWatcher);

Вы также можете использовать TextWatcher для обнаружения всех других нажатых клавиш.

Кстати, для меня onKeyDown () и onKeyUp () также отлично работают на эмуляторе. Я использую ниже код:

//To detect DELETE KEY PRESS event there is no text in EditText
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_DEL) {
        Log.d("KEY_PRESSED - onKeyDown", "KEYCODE_DEL");
    }
    return super.onKeyDown(keyCode, event);
}

//To detect DELETE KEY PRESS event there is no text in EditText
@Override
public boolean onKeyUp(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_DEL) {
        Log.d("KEY_PRESSED - onKeyUp", "KEYCODE_DEL");
    }
    return super.onKeyUp(keyCode, event);
}

ПРИМЕЧАНИЕ. Я использую эмулятор Nexus 5X API 26

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...