2011-04-22 29 views
5

我想用KEYCODE_BACK調用我的主要活動的onKeyDown(),這樣它就像我自己按下'後退'按鈕一樣。我這樣做,用下面的代碼:Fake KeyEvent不能正常工作*完全像「真實」按鈕。爲什麼?

KeyEvent goBackDown = new KeyEvent(0,0,KeyEvent.ACTION_DOWN,KeyEvent.KEYCODE_BACK,0,0); 
    goBackDown.dispatch(activity); 
    SystemClock.sleep(50); // as if human pressed the key 
    KeyEvent goBackUp = new KeyEvent(0,0,KeyEvent.ACTION_UP,KeyEvent.KEYCODE_BACK,0,0); 
    goBackUp.dispatch(activity); 

我的活動的的onkeydown()目前僅要求:

return super.onKeyDown(keyCode, event); 

然而,不像真正返回按鈕,當「假」的代碼被調用時,該活動拒絕變得不可見。

爲什麼?

回答

11

使用

dispatchKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN,KeyEvent.KEYCODE_BACK)); 

http://developer.android.com/reference/android/view/View.html#dispatchKeyEvent%28android.view.KeyEvent%29

+0

它工作。謝謝!現在我需要明白爲什麼。 :-) – srf 2011-04-22 03:52:56

+0

@srf'public final boolean dispatch(KeyEvent.Callback receiver)'已棄用。 'public final boolean dispatch(KeyEvent.Callback receiver,KeyEvent.DispatcherState state,Object target)'理論上也可以工作,但我沒有使用它的經驗。 – Aleadam 2011-04-22 04:12:23

+0

@Aleadam我們可以使用unicode char值創建KeyEvent對象嗎? – smartkid 2015-10-30 13:46:53

2

嘗試使用此

public boolean onKeyDown(int keyCode, KeyEvent event) 
{ 
    if (keyCode == KeyEvent.KEYCODE_BACK) 
    { 
     //.... 
    } 
    return true; 
} 
+0

謝謝,但我已經這樣做。當我寫「我的onKeyDown()目前只調用超級」時,我只是簡化了描述。我實際上Log.v()到onKeyDown()中的LogCat來驗證我的「假」事件實際上是被調用的。它是,但是當它達到不可見的地步時,事實並非如此。 – srf 2011-04-22 02:05:52

3

Aleadam方法不要在我的Android 4.1.2工作。所以我寫的解決方法:

public void dispachBackKey() { 
    dispatchKeyEvent(new KeyEvent (KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_BACK)); 
    dispatchKeyEvent(new KeyEvent (KeyEvent.ACTION_UP, KeyEvent.KEYCODE_BACK)); 
}