【问题标题】:Open custom menu on tap of option menu点击选项菜单打开自定义菜单
【发布时间】:2015-10-05 04:39:33
【问题描述】:

我有自定义操作栏的活动(基本上是自定义布局 xml),因此我在布局文件中创建了一个自定义菜单按钮并显示一个弹出窗口,

我正在使用此回调在点击硬件选项菜单时显示相同的弹出窗口,但会给出一个奇怪的行为,例如,当每次运行时,这将打开自定义菜单。

@Override
    public boolean onCreateOptionsMenu(Menu menu) {
        //return super.onCreateOptionsMenu(menu);
        showHideMenu();
        return false;
    }

您能否建议我可以在哪里放置showHideMenu(); 将像自定义选项菜单一样工作

//showHideMenu() code

private void showHideMenu() {
        if (mPopUpMenu.isShowing())
            dismissPopUpMenu();
        else
            showMenu();
    }

private void dismissPopUpMenu() {
        // dismiss menu
        if (mPopUpMenu != null)
            mPopUpMenu.dismiss();
    }

【问题讨论】:

  • 是否要将硬件菜单按钮链接到操作栏菜单?
  • 是正确的,我想在由操作栏菜单打开的硬件选项菜单中打开相同的弹出窗口,
  • 您想使用Hardware menu button,但在某些设备中它不存在,请再考虑一下您将如何处理它?
  • @Satyen 它存在于所有设备中,有些设备具有硬形式,有些设备具有软形式,如主页和返回按钮,因此两者的回调和 api 相同。
  • @Lavekush 请检查我的更新答案

标签: android


【解决方案1】:

你应该寻找一个 up 键事件:

public boolean onKeyUp(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_MENU) {
        showHideMenu();
        return true;
    }
    return super.onKeyUp(keyCode, event);
} 

在弹出窗口中包含此内容:

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

参考: Detecting physical Menu key press in Android

【讨论】:

  • 这工作正常,但是当我再次按下它时,此代码不会触发,这可能是因为自定义弹出窗口正在显示这就是为什么 onKeyUp 没有再次触发以进行隐藏的原因。你有什么想法吗?
  • 可能是你在 showHideMenu(); 中没有处理过这种情况。请发布此功能
  • 我有句柄,但屏幕上显示任何弹出窗口时未触发 onKeyUp 方法,并且我的菜单也是自定义弹出窗口。
  • 添加了请再看问题
  • 再检查一下,你能不能下一个断点,看看函数是否执行,即使弹出窗口正在显示?我认为您的 mPopUpMenu 实例在 dismissPopUpMenu() 中以某种方式变为空
【解决方案2】:

您可以使用PopupMenu 来显示自定义菜单。 为此你必须找到一个视图来附加menu。然后你可以写

 //Creating the instance of PopupMenu  
        PopupMenu popup = new PopupMenu(MainActivity.this, button1);  
        //Inflating the Popup using xml file  
        popup.getMenuInflater().inflate(R.menu.popup_menu,popup.getMenu()); 
popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {  
         public boolean onMenuItemClick(MenuItem item) {  
          Toast.makeText(MainActivity.this,"You Clicked : " + item.getTitle(),Toast.LENGTH_SHORT).show();  
          return true;  
         }  
        });  

        popup.show();//showing popup menu  

更多信息可以查看http://www.androidhive.info/2011/09/how-to-create-android-menus/

【讨论】:

  • 我想通过点击硬件选项菜单打开这个自定义菜单。
  • OP 有点不同,请再次通过问题给出解决方案,这在我的情况下没有用
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-07
  • 2013-04-07
  • 2017-05-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多