拦截PopupWindow中的Android菜单按钮

时间:2012-06-26 20:24:21

标签: android android-view android-menu android-keypad

我有一个不使用选项菜单的主要活动。我需要实现此行为: 1.按下Android菜单按钮时,会显示一个弹出窗口 2.再次按下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;
        }
    });

2 个答案:

答案 0 :(得分: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;
    }
});

答案 1 :(得分:0)

试试这个

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