2011-11-22 74 views
7

我試圖覆蓋後面按鍵的功能。當用戶按下它一次時,我希望它回到上一個屏幕。但是,當後退鍵被長時間按下時(比如說,兩秒或更長時間),我想退出應用程序。如何區分長按鍵和常規按鍵?

到現在爲止,我已經在我的活動重寫這兩個方法:

@Override 
public boolean onKeyDown(int keyCode, KeyEvent event){ 
    if (keyCode == KeyEvent.KEYCODE_BACK) { 
     //manage short keypress 
     return true; 
    } 
    return super.onKeyDown(keyCode, event); 
} 

@Override 
public boolean onKeyLongPress(int keyCode, KeyEvent event){ 
    if (keyCode == KeyEvent.KEYCODE_BACK) { 
     //manage long keypress (different code than short one) 
     return true; 
    } 
    return super.onKeyLongPress(keyCode, event); 
} 

onKeyLongPress回調不會被調用,因爲事件總是由onKeyDown方法來接收。

有沒有任何方法使這兩種方法的工作?還是要在onKeyDown中完成所有操作,並使用重複次數/毫秒來檢測它?

+0

乾草檢查此鏈接[KeyEvent的DOC(http://developer.android.com/reference/android/view/KeyEvent.Callback.html#onKeyDown%28int,%20android。 view.KeyEvent%29) –

回答

12

之所以onKeyLongPress不會被調用,是您在onKeyDown返回true瞞着這可能是一個長按框架 - 導致該KeyEvent停止通過不同的事件處理程序的流程。

你需要做的是這樣的:

  1. 之前返回true,則調用event.startTracking()documentation作爲解釋。
  2. 處理長按onKeyLongPress

實現如下,它會工作:

@Override 
    public boolean onKeyDown(int keyCode, KeyEvent event) { 
    if(keyCode == KeyEvent.KEYCODE_BACK) { 
     event.startTracking(); 
     return true; 
    } 
    return super.onKeyDown(keyCode, event); 
    } 

    @Override 
    public boolean onKeyUp(int keyCode, KeyEvent event) { 
    if(keyCode == KeyEvent.KEYCODE_BACK) { 
     //Handle what you want on short press.  
     return true; 
    } 

    return super.onKeyUp(keyCode, event); 
    } 

    @Override 
    public boolean onKeyLongPress(int keyCode, KeyEvent event) { 
    if(keyCode == KeyEvent.KEYCODE_BACK) { 
     //Handle what you want in long press. 
     return true; 
    } 
    return super.onKeyLongPress(keyCode, event); 
    } 
+0

問題是,在返回true之前,如果事件是用於普通印刷或長時間印刷,我必須做一些完全不同的事情。所以在任何情況下,我都必須在調用'startTracking'之前檢測'onKeyDown'方法的長按,不是嗎? –

+0

我在我的代碼中編輯了註釋以顯示我的意思。如果按鍵很短,我只想在'onKeyDown'中返回true。否則傳播到長按鍵處理程序。 –

+0

我編輯了我的答案以提供您需要的功能。 – kaspermoerch

2

爲什麼不使用onKeyUp()以及onKeyDown()?在onKeyDown()期間,您不知道它是否是長時間按壓,因爲只要按下該按鍵就會調用該按鍵,並且您不知道用戶打算按住多長時間。正如KasperMoerch所說的,您需要在onKeyDown()方法中調用startTracking,並返回true。然後在您的onKeyUp()中,您可以撥打event.isTracking()event.isLongPress()以確定是否按長按或短按來處理事情。

+0

不起作用。'isTracking'返回true,但'isLongPress'返回false,儘管我將按鈕保持近5秒。也許這不能在模擬器上測試? –

2

我認爲處理它的最好方法就是這樣。

我在這裏可以看到的唯一缺點是單擊菜單按鈕不會發出聲音,以防用戶啓用它。也許有辦法檢查這個設置並使用它,或者調用默認行爲。

代碼:

private boolean _handledMenuButton=false; 

@Override 
public boolean onKeyUp(final int keyCode,final KeyEvent event) { 
    switch(keyCode) { 
     case KeyEvent.KEYCODE_MENU: 
      if (!_handledMenuButton) { 
       //Handle single clicking here 
      } 
      _handledMenuButton=false; 
      return true; 
    } 
    return super.onKeyUp(keyCode,event); 
} 

@Override 
public boolean onKeyLongPress(final int keyCode, final KeyEvent event) { 
    switch(keyCode) { 
     case KeyEvent.KEYCODE_MENU: 
      //Handle long clicking here 
      _handledMenuButton=true; 
      return true; 
    } 
    return super.onKeyLongPress(keyCode,event); 
} 

@Override 
public boolean onKeyDown(final int keyCode,final KeyEvent event) { 
    switch(keyCode) { 
     case KeyEvent.KEYCODE_MENU: 
      _handledMenuButton=false; 
      event.startTracking(); 
      return true; 
    } 
    return super.onKeyDown(keyCode,event); 
} 
相關問題