2012-02-07 27 views
0

私は最初のキープレスを認識しないonKeyDownイベントを持っています(イベントを入力しなくても、私は 'トースト'出力を生成してテストしました)。 2番目のキーを押すと、それは完全に動作します。画面上の別の要素をクリックしてもう一度キーを押すと、もう一度キーを押す必要があります。コードは次のとおりです。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)を呼び出す必要はありません。 inside keyDown()? – kosa

+0

残念ながら、それらの両方は私のために働いていません –

答えて

0

この問題を解決するには、DPADキーを押す前にビューのフォーカスを削除してください。それは私の場合に働く。私はまったく同じ問題を抱えています:Androidアクティビティのビューに焦点が当てられたとき、最初のDPADキーイベント、つまりKeyDownイベントは無視されます。onUserInteraction(),dispatchKeyEvent()onKeyDown()のいずれのメソッドも呼び出されません。ただし、その後のDPADキーイベント - KeyUp,、KeyUp、...を取得できます。

この問題はソフトキー(Home、Previous、Recents)やハードボタンキー(BUTTON_A、BUTTON_B、BUTTON_X、BUTTON_Y)では発生しません。

+0

それを行うには? – mohitum

+0

派生クラスのSurfaceViewのコンストラクタで、setFocusable(true)を呼び出した直後にsetFocusableInTouchMode(true)を追加します。 – jonathanzh

1

私はこのような動作には十分な理由がありますが、焦点を取り除くことが良い解決策であるとは思わないと確信しています。私の回避策は、定期的なonKeyDown機能を "アクティブにする"キーダウンイベントを発生させることです。スニペット:

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

}).start(); 
関連する問題