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

这就是我想做的:

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

当前回答

试试这个:

MenuItem myitem = menu.findItem(R.id.my_item);
myitem.setVisible(false);

其他回答

P1r4nh4答案很好,我只是用一个布尔标志简化了它:

public int mState = 0; //at the top of the code
//where you want to trigger the hide action
mState = 1; // to hide or mState = 0; to show
invalidateOptionsMenu(); // now onCreateOptionsMenu(...) is called again
...

@Override
public boolean onCreateOptionsMenu(Menu menu)
{
    // inflate menu from xml
    MenuInflater inflater = getSupportMenuInflater();
    inflater.inflate(R.menu.settings, menu);

    if (mState == 1) //1 is true, 0 is false
    {
        //hide only option 2
            menu.getItem(2).setVisible(false);
    }
}

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

例子

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);
}

https://stackoverflow.com/a/21215280/466363 -由Look Alterno和Sufian回答

invalidateoptionsmenu()不回调 onPrepareOptionsMenu ();它只是直接更新菜单。 我的someMethod()从几个地方被调用,甚至在之前 onCreateOptionsMenu(),所以我必须检查mMenu != null。 应该使用API 8工作

.

private Menu mMenu;
   @Override
   public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
       inflater.inflate(R.menu.track_fragment, menu);
       mMenu = menu;
       }
   ...
   private void someMethod() {
   ...
       if (mMenu != null) {
          MenuItem item = mMenu.findItem(R.id.new_track);
          if (item != null) {
               item.setVisible(false);
               ActivityCompat.invalidateOptionsMenu(this.getActivity());
           }
       }
   ...
   }

invalidateoptionsmenu()不回调 onPrepareOptionsMenu ();它只是直接更新菜单。 我的someMethod()从几个地方被调用,甚至在之前 onCreateOptionsMenu(),所以我必须检查mMenu != null。 应该使用API 8工作

找到了这个问题的附录:

如果你想要改变菜单项的可见性,你只需要在你的活动中设置一个成员变量来记住你想要隐藏菜单并调用invalidateOptionsMenu(),并在你重写的onCreateOptionsMenu(…)方法中隐藏这些项。

//anywhere in your code
...
mState = HIDE_MENU; // setting state
invalidateOptionsMenu(); // now onCreateOptionsMenu(...) is called again
...

@Override
public boolean onCreateOptionsMenu(Menu menu)
{
    // inflate menu from xml
    MenuInflater inflater = getSupportMenuInflater();
    inflater.inflate(R.menu.settings, menu);

    if (mState == HIDE_MENU)
    {
        for (int i = 0; i < menu.size(); i++)
            menu.getItem(i).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并检查它是否只存在于一个菜单文件中。如果这个资源已经在任何地方使用并加载在一个活动中,它将尝试隐藏在那里。