Я пытаюсь обнаружить кнопку возврата или удаления на мягкой клавиатуре, используя метод ниже. Он отлично работает на физических устройствах, но не работает 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>
Изображение кнопки удаления:
Поняв ваше требование, я обнаружил, что 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.
я хочу обнаружить кнопку удаления. Я не думаю, что это возможно с вашим методом.
@XoXo ты пробовал мой метод? Как можно сказать без тестирования? Это будет работать.
Проблема с вашей реализацией заключается в том, что она не обнаруживает кнопку удаления, когда EditText пуст. Я пытаюсь перейти к предыдущим полям EditText, если пользователь нажимает удалить в текущем пустом поле EditText. Поэтому я полагался на метод dispatchKeyEvent().
@XoXo, вы упомянули это требование? Как я узнаю, что вы хотите этого добиться? Я обновлю ответ
Я обновлю свой вопрос. Извините за недопонимание.
какой эмулятор вы использовали? Я использую Nexus API 25. Есть ли какие-то настройки, которые нам нужно изменить, чтобы заставить его работать?
@XoXo обновил мой ответ о том, как проверить с помощью TextWatcher, если EditText пуст. Также onKeyDown и onKeyUp также работают должным образом. Проверить прикрепленное видео
@XoXo Я использую эмулятор Nexus 5X API 26.
Проверьте мой обновленный ответ, похоже, у Nexus API 25 есть проблема.
Идеально! Может быть ошибка в API 25
@XoXo Неважно. На будущее, пожалуйста, предоставьте как можно больше информации, задавая любой вопрос. Это поможет другим быстрее разобраться в вашей проблеме и найти необходимое решение. Удачного кодирования :)
Да, большое спасибо за ответ и совет. Я обязательно задам четкие вопросы.
Этот вопрос полностью отличается от моего. Мой код отлично работает на всех реальных устройствах. Но не в эмуляторе. @NileshRathod