2012-06-30 3 views
20

Я хочу поймать нажатие любой клавиши на клавиатуре. Я не хочу EditView или TextView в своей деятельности, событие должно обрабатываться из расширенного представления внутри моей активности.Android - нажмите клавишу клавиатуры

Я просто попытался это:

1) Перекрыть метод onKeyUp(int keyCode, KeyEvent event) активности. Это не работает с softkeybord, он просто улавливает несколько жестких клавиш.

2) Создайте мой OnKeyListener и зарегистрируйте его в моем представлении, который содержит зарегистрированный и рабочий OnTouchListener. Это не работает с softkeyboar.

3) Переопределить метод onKeyUp(int keyCode, KeyEvent event) View. Это не работает на всех niether, если я устанавливаю свой OnKeyListener, и если я его не установлю.

4) С объектом InputMethodManager Позвоните по методу showSoftInput и передайте ему мой вид. Это не работает ни для повышения клавиатуры, действительно, мне нужно позвонить toggleSoftInput; ни поймать ключевые события.

Я тестировал все только в эмуляторе, но думаю, этого достаточно. Почему так сложно усвоить простое ключевое событие с клавиатуры?

+0

И когда вы изучили исходный код классов, как '' EditText' и TextView', чтобы увидеть, как они справиться с этим, что вы узнали? – CommonsWare

+5

Изучение исходного кода может помочь, но займет слишком много времени. – Bemipefe

ответ

31

Попробуйте использовать dispatchKeyEvent(KeyEvent event) в вашем Activity

@Override 
public boolean dispatchKeyEvent(KeyEvent event) { 
    Log.i("key pressed", String.valueOf(event.getKeyCode())); 
    return super.dispatchKeyEvent(event); 
} 
+0

Он работает! Большое спасибо vasart – Bemipefe

+0

Однако есть проблемы с символом, выбранным всплывающим окном, которое появляется при длинном нажатии. Например, если я долгое время нажимаю «a», и я выбираю «à» как getKeyCode, так и getUnicodeChar return 0 – Bemipefe

+0

Посмотрите на метод getDeadChar() 'в классе KeyEvent – vasart

13

С намеком vasart я могу получить событие KeyPress. Чтобы сделать печатный код для клавиатуры, я использовал функцию getUnicodeChar, передав ей статус мета-кнопки, а затем просто обработчик проблемы решает проблему.

Это рабочий код:

@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-символа.

+0

В моем случае пользовательский вид на клавиатуре не отвечает на dispatchkeyEvent .. Я выполнил клавиатуруView, и мне бы хотелось обнаружить комбинацию клавиш, таких как ctrl + c, Ctrl + v вроде этого. Как я могу добиться этого – Roster

0

Когда клавиатура открыта в деятельности вашей деятельность фактически становится на переднем плане ... Все TextArea или имеют свой Текстовые поля собственного механизма, чтобы получить Keypressed от экранной клавиатуры ... если вы хотите использовать OnKeyDown() для виртуального у слушателя клавиатуры макияжа убедитесь, что вы установили в AndroidManifest File под свой андроид: windowSoftInputMode = "stateAlwaysVisible", тогда onkeyDown() будет работать, это сработало для меня ...

1

Нет возможности обрабатывать события нажатия клавиш на мягкой клавиатуре (вкл. - экранная клавиатура) только с аппаратной клавиатуры.

для более подробной информации: Handling Keyboard Actions

Смежные вопросы