Android - Почему onKeyUp вызывает KeyEvent, а onKeyDown - нет?
В моем текущем режиме просмотра открыта клавиатура с цифрами от 0 до 9, клавиша удаления и клавиша ввода. Я добавил оба onKeyDown
и onKeyUp
событие. Оба должны регистрировать код клавиши на консоли отладки при нажатии.
@Override
public boolean onKeyDown(int pKeyCode, KeyEvent pKeyEvent) {
Log.d("KEYDOWN", pKeyCode+"");
return true; // also tried false
}
@Override
public boolean onKeyUp(int pKeyCode, KeyEvent pKeyEvent) {
Log.d("KEYUP", pKeyCode+"");
return true;
}
Я нажал каждую клавишу на клавиатуре со следующим результатом:
D/KEYUP: 8
D/KEYUP: 9
D/KEYUP: 10
D/KEYUP: 11
D/KEYUP: 12
D/KEYUP: 13
D/KEYUP: 14
D/KEYUP: 15
D/KEYUP: 16
D/KEYDOWN: 67
D/KEYUP: 67
D/KEYUP: 7
D/KEYUP: 66
Может кто-нибудь объяснить, почему событие keydown никогда не срабатывает при 0-9 и вводить? Мне действительно нужно, чтобы он срабатывал при нажатии 0-9.
РЕДАКТИРОВАТЬ: я добавил решение, которое решило проблему, заменив обе функции на
dispatchKeyEvent
, Это не объясняет почемуonKeyDown
Я не узнал эти ключи.Кто-то получил ответ за это?
2 ответа
Я только нашел решение, чтобы обойти эту проблему, но я не нашел причину, почему это происходит в первую очередь.
Этот код сделал работу:
@Override
public boolean dispatchKeyEvent(KeyEvent event) {
if (event.getAction()==KeyEvent.ACTION_DOWN) {
Log.d("KEYDOWN", event.getKeyCode()+"");
}
else if (event.getAction()==KeyEvent.ACTION_UP) {
Log.d("KEYUP", event.getKeyCode()+"");
}
Log.d("KEY", event.getKeyCode()+"");
return false;
}
Чтобы понять рабочий процесс, вам нужно немного погрузиться в код, это не так очевидно, но тем не менее. Ваш конкретный случай зависит от того, какой вид вы расширяете и IME. Из документов:
В целом, платформа не может гарантировать, что ключевые события, которые она доставляет представлению, всегда представляют собой полные последовательности ключей, поскольку некоторые события могут быть отброшены или изменены путем содержания представлений до их доставки. Реализация представления должна быть подготовлена для обработки FLAG_CANCELED и должна допускать аномальные ситуации, такие как получение нового ACTION_DOWN без предварительного получения ACTION_UP для предыдущего нажатия клавиши.
Вы можете использовать TextWatcher - это хорошее решение, но я не знаю о ваших потребностях. В любом случае, если вы переопределяете onKeyDown()
- он будет запущен, и вам нужно обработать его самостоятельно или вызвать родительскую реализацию. В случае с EditText - onKeyDown
будет обрабатываться TextView, несмотря на несколько случаев (т.е. кнопка "Назад").