Android - нажмите клавишу клавиатуры
Я хочу поймать нажатие любой клавиши на клавиатуре. Я не хочу EditView или TextView в моей деятельности, событие должно быть обработано из расширенного представления внутри моей деятельности.
Я только что попробовал это:
1) Переопределите метод действия onKeyUp(int keyCode, KeyEvent event)
. Это не работает с softkeyboard, оно просто ловит несколько hardkeyboard.
2) Создайте мой OnKeyListener
и зарегистрируйте его в моем просмотре, который содержит зарегистрированный и рабочий OnTouchListener
. Это не работает вообще с softkeyboard.
3) Переопределите метод просмотра onKeyUp(int keyCode, KeyEvent event)
. Это не работает вообще, если я не установил свой OnKeyListener и не установил его.
4) С помощью объекта InputMethodManager
Вызовите метод showSoftInput
и передайте его моему представлению. Это не работает ни для поднятия клавиатуры, на самом деле я должен позвонить toggleSoftInput
; ни поймать ключевые события.
Я тестировал все только в эмуляторе, но я думаю, что этого достаточно. Почему так сложно взять простое клавишное событие с клавиатуры?
Ответы
Ответ 1
Для работы с аппаратными клавишами и клавишей Назад вы можете использовать dispatchKeyEvent(KeyEvent event)
в вашем Activity
@Override
public boolean dispatchKeyEvent(KeyEvent event) {
Log.i("key pressed", String.valueOf(event.getKeyCode()));
return super.dispatchKeyEvent(event);
}
UPD: к сожалению, вы не можете обрабатывать события программной клавиатуры (см. Обработка событий с одной клавишей), если вы не разработали собственную пользовательскую клавиатуру (перейдите по ссылке, чтобы узнать, как создавать ввод метод).
Ответ 2
С подсказкой vasart я могу получить событие KeyPress. Чтобы сделать печатный код для клавиатуры, я использовал функцию getUnicodeChar, передав ей состояние мета-кнопки, тогда просто репликация char решит проблему.
Это рабочий код:
@Override
public boolean dispatchKeyEvent(KeyEvent KEvent)
{
int keyaction = KEvent.getAction();
if(keyaction == KeyEvent.ACTION_DOWN)
{
int keycode = KEvent.getKeyCode();
int keyunicode = KEvent.getUnicodeChar(KEvent.getMetaState() );
char character = (char) keyunicode;
System.out.println("DEBUG MESSAGE KEY=" + character + " KEYCODE=" + keycode);
}
return super.dispatchKeyEvent(KEvent);
}
Конечно, эта работа работает только с символом ASCII.
Ответ 3
Нет возможности обрабатывать события нажатия клавиш на программной клавиатуре (экранной клавиатуре) только с аппаратной клавиатуры.
для более подробной информации: Обработка действий клавиатуры
Примечание. При обработке событий клавиатуры с помощью класса KeyEvent и связанных API-интерфейсов следует ожидать, что такие события клавиатуры происходят только с аппаратной клавиатуры. Вы никогда не должны полагаться на получение событий клавиш для любой клавиши на программном методе ввода (экранная клавиатура).
Ответ 4
Когда клавиатура открыта в действии, ваша деятельность фактически становится передним планом...
У всех TextArea или TextFields есть свой механизм, чтобы получить нажатие на клавиатуре onScreen...
если вы хотите использовать onKeyDown() listner для виртуальной клавиатуры, убедитесь, что вы установили в AndroidManifest File под свою активность android: windowSoftInputMode = "stateAlwaysVisible", тогда onkeyDown() будет работать, это сработало для меня...