2012-06-03 41 views
3

如何在硬件菜單按鈕上設置一個長按監聽程序?程序訪問菜單按鈕的方式是什麼?如何訪問Android中的LongClick菜單按鈕?

此外,如何區分長按和單按? (據我所知,當單擊事件被執行時,單擊事件也會被傳播 - 我不希望發生這種情況,因爲在這兩種情況下我需要2種不同的操作。長按並單擊單獨的偵聽器設備菜單按鈕)

謝謝!

回答

2

這種感覺很直接。查看Android開發者網站上的KeyEvent.Callback

在那裏你會找到onKeyLongPress()以及onKeyDown()onKeyUp()。這應該讓你走上正軌。如果您需要任何進一步幫助,請留言或張貼您的代碼。

編輯:我只是重讀這個問題。如果您無法區分單擊和長按,您將需要使用onKeyDownonKeyUp並檢查點擊的持續時間。基本上,您將在onKeyDown中啓動計時器,並檢查onKeyUp中的時間。你將不得不注意FLAG_CANCELED

更多編輯:我找到了做幾個測試的時間。此代碼應該做你想做的事情(onKeyUp()只能獲得短時間的新聞事件,而onLongPress()只能獲得長時間的新聞事件)。

這裏的關鍵是event.startTracking()onKeyDown()處理程序中的調用。

放置在Activity(這也應在自定義視圖中工作很好,但未經測試):

@Override 
public boolean onKeyLongPress(int keyCode, KeyEvent event) { 
    if (keyCode == KeyEvent.KEYCODE_MENU) { 
     // Handle Long Press here 
     Log.i("KeyCheck", "LongPress"); 
     return true;  
    } 
    return super.onKeyLongPress(keyCode, event); 
} 
@Override 
public boolean onKeyDown(int keyCode, KeyEvent event) { 
    Log.i("KeyCheck", "KeyDown" + keyCode); 
    if (keyCode == KeyEvent.KEYCODE_MENU) { 
     event.startTracking(); //call startTracking() to get LongPress event 
     return true; 
    } 
    return super.onKeyDown(keyCode, event); 
} 
@Override 
public boolean onKeyUp(int keyCode, KeyEvent event) { 
    if (keyCode == KeyEvent.KEYCODE_MENU && event.isTracking() 
      && !event.isCanceled()) { 
     // handle regular key press here 
     Log.i("KeyCheck", "KeyUp"); 
     return true; 
    } 
    return super.onKeyUp(keyCode, event); 
} 
+0

這工作得精美,跟蹤真正幫助在這裏。謝謝! – alex

+0

它不適用於我的情況。我想拿着菜單鍵不顯示軟鍵盤。您的解決方案甚至禁用我的菜單選項 – Emerald214

+0

如果您不希望菜單可以正常工作,則完全禁用單一菜單,我同意這樣做效果很好。當你不想忽視單一媒體時,是否有辦法讓這項工作成爲可能? – JPM

相關問題