2012-06-26 108 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 
    }