我有一个带有菜单项的操作栏。如何隐藏/显示菜单项?

这就是我想做的:

MenuItem item = (MenuItem) findViewById(R.id.addAction);
item.setVisible(false);
this.invalidateOptionsMenu();

当前回答

获取一个指向这样的菜单项,调用setVisible来调整它的可见性,然后在你的活动上调用invalidateOptionsMenu(),这样动作栏菜单就会相应调整。

更新:菜单项不是常规视图,它是布局的一部分。它很特别,完全不同。你的代码为item返回null,这导致了崩溃。你需要做的是:

MenuItem item = menu.findItem(R.id.addAction);

下面是你应该调用的顺序: 首先调用invalidateOptionsMenu(),然后在onCreateOptionsMenu(Menu)内部获得对MenuItem的引用(通过调用Menu . finditem())并在其上调用setVisible()

其他回答

你可以使用toolbar.getMenu().clear();一次隐藏所有菜单项

我认为更好的方法是为菜单使用成员变量,在onCreateOptionsMenu()中初始化它,然后只使用setVisible(),而不使选项菜单无效。

通过设置菜单中所有项目的可见性,应用程序栏菜单或溢出菜单将自动隐藏

例子

private Menu menu_change_language;

...

...

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    ...
    ...
    menu_change_language = menu;
    menu_change_language.findItem(R.id.menu_change_language)
           .setVisible(true);

    return super.onCreateOptionsMenu(menu);
}

在去其他片段之前使用下面的代码:

if(menu_change_language != null){                 
    menu_change_language.findItem(R.id.menu_change_language)
       .setVisible(false);
}

如果您按照上述答案执行了所有操作,但仍然可以看到菜单项,请检查您是否引用了唯一的资源。 例如,在onCreateOptionsMenu或onPrepareOptionsMenu

@Override
public void onPrepareOptionsMenu(Menu menu) {
    super.onPrepareOptionsMenu(menu);
    MenuItem menuOpen = menu.findItem(R.id.menu_open);
    menuOpen.setVisible(false);
}

Ctrl +单击R.id。Menu_open并检查它是否只存在于一个菜单文件中。如果这个资源已经在任何地方使用并加载在一个活动中,它将尝试隐藏在那里。

对于使用Appcompat库的用户: 如果你的Activity子类ActionBarActivity,你可以调用supportInvalidateOptionsMenu()

图示: https://stackoverflow.com/a/19649877/1562524