Невозможно обнаружить кнопку удаления программной клавиатуры в эмуляторе

Я пытаюсь обнаружить кнопку возврата или удаления на мягкой клавиатуре, используя метод ниже. Он отлично работает на физических устройствах, но не работает 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>

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

Невозможно обнаружить кнопку удаления программной клавиатуры в эмуляторе

Этот вопрос полностью отличается от моего. Мой код отлично работает на всех реальных устройствах. Но не в эмуляторе. @NileshRathod

sagar suri 03.05.2018 09:19
1
1
881
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Поняв ваше требование, я обнаружил, что 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.

я хочу обнаружить кнопку удаления. Я не думаю, что это возможно с вашим методом.

sagar suri 11.05.2018 08:49

@XoXo ты пробовал мой метод? Как можно сказать без тестирования? Это будет работать.

Vikasdeep Singh 11.05.2018 08:54

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

sagar suri 11.05.2018 09:07

@XoXo, вы упомянули это требование? Как я узнаю, что вы хотите этого добиться? Я обновлю ответ

Vikasdeep Singh 11.05.2018 09:19

Я обновлю свой вопрос. Извините за недопонимание.

sagar suri 11.05.2018 09:20

какой эмулятор вы использовали? Я использую Nexus API 25. Есть ли какие-то настройки, которые нам нужно изменить, чтобы заставить его работать?

sagar suri 11.05.2018 10:10

@XoXo обновил мой ответ о том, как проверить с помощью TextWatcher, если EditText пуст. Также onKeyDown и onKeyUp также работают должным образом. Проверить прикрепленное видео

Vikasdeep Singh 11.05.2018 10:11

@XoXo Я использую эмулятор Nexus 5X API 26.

Vikasdeep Singh 11.05.2018 10:12

Проверьте мой обновленный ответ, похоже, у Nexus API 25 есть проблема.

Vikasdeep Singh 11.05.2018 10:26

Идеально! Может быть ошибка в API 25

sagar suri 11.05.2018 10:32

@XoXo Неважно. На будущее, пожалуйста, предоставьте как можно больше информации, задавая любой вопрос. Это поможет другим быстрее разобраться в вашей проблеме и найти необходимое решение. Удачного кодирования :)

Vikasdeep Singh 11.05.2018 10:34

Да, большое спасибо за ответ и совет. Я обязательно задам четкие вопросы.

sagar suri 11.05.2018 10:36

Другие вопросы по теме