2012-02-07 8 views
0

У меня есть событие onKeyDown, которое не распознает первый нажатие клавиши (даже не войдя в событие, я протестировал, выпустив «тост»). На втором нажатии и после этого он отлично работает. Если я нажму на другой элемент на экране и попробую снова нажать клавишу, ему еще раз понадобится еще одно нажатие клавиши, чтобы это произошло. Вот код:Событие onKeyDown не называется в первый раз?

public boolean onKeyDown(int keyCode, KeyEvent event) 
{ 
    switch (keyCode) { 
    case KeyEvent.KEYCODE_DPAD_LEFT: 
     scorered.performClick(); 
     return true; 


    case KeyEvent.KEYCODE_1: 
     red_m1.performClick(); 
     return true; 


     case KeyEvent.KEYCODE_DPAD_RIGHT: 
     scoreblue.performClick(); 
     return true; 


     case KeyEvent.KEYCODE_2: 
     blue_m1.performClick(); 
     return true; 

     case KeyEvent.KEYCODE_BACK: 
      finish(); 
     return true; 
    } 
    return true; 
    } 

Я был в тупике в течение нескольких часов, поэтому любая помощь очень ценится!

+0

Вы включили setFocusableInTouchMode? и вам не нужно называть super.onKeyDown (keyCode, event); внутри keyDown()? – kosa

+0

К сожалению, оба эти не работали для меня –

ответ

0

Чтобы исправить это, необходимо обрезать фокус обзора перед нажатием любой клавиши DPAD. Это работает в моем случае. У меня точно такая же проблема: когда фокус Android направлен на фокус, игнорируется первое событие ключевого события DPAD, то есть событие KeyDown: ни один из этих методов не вызывается: onUserInteraction(), dispatchKeyEvent(), onKeyDown(). Однако последующие ключевые события DPAD - KeyUp, KeyDown, KeyUp, ..., могут быть сняты.

Обратите внимание, что эта проблема не возникает при использовании программных клавиш (Главная, Предыдущий, Отрезок), а также жестких кнопок кнопок (BUTTON_A, BUTTON_B, BUTTON_X, BUTTON_Y).

+0

Как это сделать? – mohitum

+0

В конструкторе вашего производного класса SurfaceView добавьте setFocusableInTouchMode (true) сразу после вызова setFocusable (true). – jonathanzh

1

Я уверен, есть веские причины для такого поведения, но не думайте, что удаление фокуса является хорошим решением. Мое обходное решение заключается в том, чтобы запустить событие keydown, что «активирует» регулярную функцию onKeyDown. Вот фрагмент:

new Thread(new Runnable() {   
    @Override 
    public void run() { 
     Instrumentation inst = new Instrumentation(); 
     inst.sendKeyDownUpSync(KeyEvent.KEYCODE_DPAD_UP); 
    } 

}).start(); 
Смежные вопросы