如何获取我的Activity的选项菜单?

48
在我的Activity的某些方法中,我想要检查菜单的标题或者知道它是否被选中。我该如何获取Activity的菜单?我需要像 this.getMenu() 这样的东西。

1
“Name”和“Checked”?我不明白。ID和偏好设置? - keyser
你是在说选项菜单吗? 像 "public boolean onCreateOptionsMenu(Menu menu)"中创建的那个? - MikeIsrael
@Keyser:在某些情况下,菜单项的标题会被更改。 - Bobs
6个回答

121

要小心使用invalidateOptionsMenu()。它会重新创建整个菜单,这会带来很大的开销,并会重置嵌入式组件,如SearchView。我花了很长时间才找出为什么我的SearchView会“随机”关闭。

最终,我采用了Dark发布的方法,先捕获菜单,然后根据需要调用onPrepareOptionsMenu(Menu)。 这样符合我的要求而没有任何负面影响。注意:确保在菜单创建之前进行空值检查,以防在调用onPrepareOptionsMenu()时菜单还未被创建。我是这样做的:

private Menu mOptionsMenu;

@Override
public boolean onCreateOptionsMenu(final Menu menu) {
    mOptionsMenu = menu
    ...
}

private void updateOptionsMenu() {
    if (mOptionsMenu != null) {
        onPrepareOptionsMenu(mOptionsMenu);
    }
}

非常棒的答案!出于某些原因,我无法确定要传递到onPrepareOptionsMenu()的菜单,因为我想根据仅在启动服务时发生的条件来更改它。无论如何…… - James W
我同意开销有点太大了,如果使用invalidateOptionsMenu()会非常明显。我更喜欢这个解决方案使用更少的工作量。 - Nico Dumdum
2
每次屏幕旋转时,我使用这个功能会不断收到 null。 - levi
如果你有一个菜单对象,那么它比这个解决方案更好。 - user9599745
在Activity中,难道没有任何属性或方法可以在onCreateOptionsMenu()/onOptionsItemSelected()之外获取MenuItems吗? - Nadimuddin

32

调用invalidateOptionsMenu()而不是传递菜单对象。


4
很遗憾,这个功能是从API 11开始添加的 :( - greg7gkb
更好的答案,包括实际代码,即 requireActivity().invalidateOptionsMenu() - lasec0203

15

通过将菜单对象传递给您的Activity类,您可以实现这一点。

public class MainActivity extends Activity
{
    ...
    ...
    private Menu _menu = null;

    @Override
    public boolean onCreateOptionsMenu(Menu menu) 
    {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.activity_main, menu);
        _menu = menu;
        return true;
    }

    private Menu getMenu()
    {
        //use it like this
        return _menu;
    }
}

2
调用invalidateOptionsMenu()更好!你只需要在onPrepareOptionsMenu(Menu menu)方法中提供更新即可。 - AntoineP

1

据我理解,您想要的是以下内容,这可能会对您有所帮助:

1. 参考选项菜单上的教程。

2. 每次用户按下菜单按钮时,您可以通过getTitle()检查其标题。

3. 或者,如果您想要知道用户在未按下菜单按钮时选择的最后一个菜单项,则需要在用户按下时存储首选项。


1

有几个回调方法提供菜单作为参数。

你可能想在那里操作它。

例如:

onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo)
onCreateOptionsMenu(Menu menu)
onCreatePanelMenu(int featureId, Menu menu)

还有更多,请查看活动文档并查找所需的方法: http://developer.android.com/reference/android/app/Activity.html


在你的解决方案中,数值不是最新的。 - Bobs
不知道确切的行为,但您认为将引用保存在字段变量中是否可行?例如:onCreateOptionsMenu(Menu menu){ this.menu = menu . . . . 然后稍后访问它以请求标题? - Ostkontentitan
我简直不敢相信没有一个简单地返回菜单对象的方法。就像我们可以获取活动的上下文、窗口、布局填充器等一样。 - user9599745

0

现在Android有工具栏小部件,它是一个可以设置/获取菜单的控件。例如,在Activity中使用setSupportActionBar(Toolbar)来设置工具栏,从Fragment中使用onCreateOptionsMenu等方法进行一些变化。线程已重新启动!


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