2012-06-26 129 views
5

我有一個不使用選項菜單的主要活動。我需要實現這個行爲: 1.當Android菜單按鈕被按下時,彈出窗口被顯示 2.當再次按下Android菜單按鈕時,彈出窗口被解除。攔截PopupWindow中的Android菜單按鈕

我知道如何通過在主要活動中覆蓋onKeyDown()來做#1,但不知道如何去做#2。當顯示彈出窗口時,主活動的onKeyDown()不再被觸發。

當主要活動打開彈出窗口時,如何捕獲Android菜單按鈕? (在我的例子中,彈出窗口是一個PopupWindow,它具有充氣的視圖)。

順便說一句,我試圖設置一個按鍵偵聽器,在彈出的主視圖,但它不會被觸發

mTopView.setOnKeyListener(new View.OnKeyListener() {   
     @Override 
     public boolean onKey(View v, int keyCode, KeyEvent event) { 
      LogUtil.debug("*** Key: %d", keyCode); 
      return false; 
     } 
    }); 
+1

如果是我,我會將「彈出式窗口」放入其自己的活動中,這樣可以以與MainActivity中完全相同的方式完成。在彈出活動中按下菜單時,請調用finish()。 – FoamyGuy

+0

謝謝。我在彈出的解決方案中投入了大量代碼(它需要在與錨點視圖相關的特定位置和形狀中彈出)。如果我不能找到一種方法來實現它,我將嘗試活動方法。 – user1139880

回答

14

回答我的問題。在PopupWindow視圖中調用setFocusableInTouchMode()可以實現這個技巧,並使偵聽器工作。

PopupMenu popupMenu = ... 
... 
popupWindow.getContentView().setFocusableInTouchMode(true); 
popupMenu.getContentView().setOnKeyListener(new View.OnKeyListener() {   
    @Override 
    public boolean onKey(View v, int keyCode, KeyEvent event) { 
     if (keyCode == KeyEvent.KEYCODE_MENU && 
       event.getRepeatCount() == 0 && 
       event.getAction() == KeyEvent.ACTION_DOWN) { 
      // ... payload action here. e.g. popupMenu.dismiss(); 
      return true; 
     }     
     return false; 
    } 
}); 
0

試試這個

if (keyCode == KeyEvent.KEYCODE_MENU) { 
     // Do Stuff 
    }