OpenOptionsMenu不使用ActionBarSherlock自定义SubMenu

时间:2013-09-21 21:15:56

标签: android actionbarsherlock submenu android-optionsmenu

在我的应用程序中,我使用的是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>

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

我的问题:

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"

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

2 个答案:

答案 0 :(得分:1)

我今天和你一样有同样的问题。我认为这是因为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);
}

希望它有所帮助。

答案 1 :(得分:0)

这就是我解决问题的方法,但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);
    }