【问题标题】:OpenOptionsMenu not working with ActionBarSherlock Custom SubMenuOpenOptionsMenu 不适用于 ActionBarSherlock 自定义子菜单
【发布时间】:2013-09-27 01:52:14
【问题描述】:

在我的应用程序中,我使用的是 ActionBarSherlock 4.4。

由于 ForcedOverflow 已从最新版本中删除,因此我使用以下 XML 代码来复制 OverflowMenu。

<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:id="@+id/menu_overflow"
        android:icon="@drawable/abs__ic_menu_moreoverflow_holo_dark"
        android:orderInCategory="100"
        android:showAsAction="always">
        <menu>
            <item
                android:id="@+id/action_settings"
                android:showAsAction="never"
                android:title="@string/action_settings" />
            <item
                android:id="@+id/recycleBin"
                android:showAsAction="never"
                android:title="Recycle Bin" />
        </menu>
    </item>
</menu>

Overflow 现在对我来说非常好用,适用于 Android 4.3 和 2.3.3。

我的问题:

2.3.3 设备有一个硬件菜单键。我希望在按下菜单键时,应打开溢出选项菜单。

我在 Activity 中使用了以下代码,但它不起作用。 (不过,我在 LogCat 中收到了消息)

@Override
    public boolean onKeyUp(int keyCode, KeyEvent event) { 
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB) {
            if (event.getAction() == KeyEvent.ACTION_UP &&
                keyCode == KeyEvent.KEYCODE_MENU) {
                Log.d("HomeActivity", "OpenOptionsMenu");
                openOptionsMenu();
                return true;
            }
        }
        return super.onKeyUp(keyCode, event);
    }

我环顾四周,尝试了所有建议的解决方案。但是没有人在谈论使用 openOptionsMenu() 打开自定义溢出菜单。

我在这里遗漏了什么吗?

有没有一种方法可以让它看起来好像父溢出图标项android:id="@+id/menu_overflow" 已被单击?

如果有人指出我在这里遗漏了什么,那就太好了。

【问题讨论】:

    标签: android actionbarsherlock submenu android-optionsmenu


    【解决方案1】:

    这就是我解决问题的方法,但Ricardo's answer 也可以。

    private Menu optionsMenu;
        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            // Inflate the menu; this adds items to the action bar if it is present.
            getSupportMenuInflater().inflate(R.menu.display_all, menu);
            optionsMenu = menu;
            return true;
        }
    
        @Override
        public boolean onKeyUp(int keyCode, KeyEvent event) { 
            if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB) {
                if (event.getAction() == KeyEvent.ACTION_UP &&
                        keyCode == KeyEvent.KEYCODE_MENU) {
                    //openOptionsMenu();
                    optionsMenu.performIdentifierAction(R.id.menu_overflow, 0);
                    return true;
                }
            }
            return super.onKeyUp(keyCode, event);
        }
    

    【讨论】:

      【解决方案2】:

      我今天遇到了和你一样的问题。我认为这是因为 ActionBarSherlock 有自己的选项菜单实现,它覆盖了 Android 的选项菜单,在此过程中禁用了 openOptionsMenu() 方法。也许这是图书馆的一个错误?

      无论如何,我通过在包含菜单的活动中覆盖onKeyUp 解决了这个问题,如下所示:

      @Override
      public boolean onKeyUp(int keyCode, KeyEvent event) {
          if (keyCode == KeyEvent.KEYCODE_MENU) {
              View v = findViewById(R.id.YOUR_MENU_VIEW_HERE);
              v.performClick();
              return true;
          }
          return super.onKeyUp(keyCode, event);
      }
      

      希望对你有帮助。

      【讨论】:

      • 感谢您的回答!但是我已经使用与 optionsMenu 相关的另一种方法解决了这个问题(检查我的答案)。但是,您的答案很简单(可能是 hacky 方法)。从我这边+1。我喜欢黑客!! :D
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-15
      相关资源
      最近更新 更多