2012-02-07 95 views
0

我有一個onKeyDown事件,它不會識別第一個按鍵(即使輸入事件,我也會通過生成'toast'輸出來測試)。在第二個按鍵之後,它完美地工作。如果我點擊屏幕上的另一個元素並再次嘗試按鍵,它又需要另一個按鍵才能實現。下面是代碼: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 2012-02-07 15:17:51

+0

不幸的是,這兩個都沒有爲我工作 – 2012-02-08 11:49:56

回答

0

要解決此問題,解決方法是在按任何DPAD鍵之前刪除視圖焦點。它適用於我的情況。我有完全相同的問題:當Android Activity的視圖焦點時,第一個DPAD鍵事件,即KeyDown事件被忽略:以下方法都不會被調用:onUserInteraction(),dispatchKeyEvent(),onKeyDown()。但是,可以捕獲後續的DPAD密鑰事件 - KeyUp,KeyDown,KeyUp,...。

請注意,軟鍵(Home,Previous,Recents)和硬按鈕鍵(BUTTON_A,BUTTON_B,BUTTON_X,BUTTON_Y)都不會出現此問題。

+0

如何做到這一點? – mohitum 2014-04-17 09:28:26

+0

在派生類SurfaceView的構造函數中,在調用setFocusable(true)之後添加setFocusableInTouchMode(true)。 – jonathanzh 2014-06-03 18:08:08

1

我敢肯定,這種行爲有很好的理由,但不要認爲,消除焦點是一個很好的解決方案。我的解決方法是激發一個keydown事件,即「激活」常規的onKeyDown功能。這裏是摘錄:

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

}).start(); 
相關問題