【问题标题】:Intercepting Android Menu button in a PopupWindow在 PopupWindow 中拦截 Android 菜单按钮
【发布时间】:2012-06-26 20:24:20
【问题描述】:

我有一个不使用选项菜单的主要活动。我需要实现这种行为: 1. 按下 Android 菜单按钮时,会显示一个弹出窗口 2. 再次按下Android Menu按钮时,弹出窗口消失。

我知道如何通过在主要活动中覆盖 onKeyDown() 来执行 #1,但不知道如何执行 #2。显示弹窗时,不再触发主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;
        }
    });

【问题讨论】:

  • 如果是我,我会把“弹出”变成它自己的活动,这样它就可以像在 MainActivity 中一样完成。只需在弹出活动中按下菜单时调用 finish()。
  • 谢谢。我在弹出解决方案中投入了大量代码(它需要在与锚视图相关的特定位置和形状处弹出)。如果我找不到让它工作的方法,我会尝试活动方法。

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


【解决方案1】:

回答我自己的问题。在 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;
    }
});

【讨论】:

    【解决方案2】:

    试试这个

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多