拦截Android菜单按钮在PopupWindow中

5
我有一个主Activity,它不使用选项菜单。我需要实现以下行为: 1. 当按下Android菜单按钮时,会显示弹出窗口 2. 再次按下Android菜单按钮时,弹出窗口将被关闭。
我知道如何通过在主Activity中重写onKeyDown()方法来完成第一步,但是不知道如何完成第二步。当弹出窗口显示时,主Activity的onKeyDown()方法不再触发。
当主Activity有打开的弹出窗口时,如何捕获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
谢谢。我已经在弹出解决方案上投入了很多代码(它需要在锚定视图的特定位置和形状处弹出)。如果我找不到使其正常工作的方法,我将尝试采用activity方法。 - user1139880
2个回答

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
    } 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接