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

这就是我想做的:

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

当前回答

试试这个:

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

其他回答

这在《Activity》和《Fragment》中都很奏效

@Override
public void onPrepareOptionsMenu(Menu menu) {
    super.onPrepareOptionsMenu(menu);
    if (menu.findItem(R.id.action_messages) != null)
        menu.findItem(R.id.action_messages).setVisible(false);
}

对我没用。我必须显式地使用onprepareoptionmenu来设置一个项目不可见。

所以使用onCreateOptionsMenu创建菜单和onPrepareOptionsMenu改变可见性等。

您正在尝试从一个活动中访问一个菜单项,该活动没有访问范围的权限。查找菜单项的调用将返回null,因为视图既没有与您调用的活动绑定,也没有与您调用的布局绑定。

菜单项与“导航栏”等项绑定,而“导航栏”又与相应的活动绑定。

因此在activity()中初始化这些视图,然后在这些视图中访问菜单项。

Navigation navView;
navView = findViewById(R.id.navigationView);

MenuItem item = navView.getMenu().findItem(R.id.item_hosting);
item.setVisible(false);

按常规方法创建菜单选项(参见下面的代码),并在类中向菜单添加全局引用

Menu mMenu;  // global reference within the class
@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.menu_tcktdetails, menu);
    mMenu=menu;  // assign the menu to the new menu item you just created 
    return true;
}


@Override
public boolean onOptionsItemSelected(MenuItem item) {
    int id = item.getItemId();
    if (id == R.id.action_cancelticket) {
        cancelTicket();

        return true;
    }

    return super.onOptionsItemSelected(item);
}

现在您可以通过使用按钮或在函数中运行这段代码来切换菜单

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

最初在菜单布局文件中将菜单项可见性设置为false,如下所示:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">
    <item
        android:visible="false"
        android:id="@+id/action_do_something"
        android:title="@string/txt_do_something"
        app:showAsAction="always|withText"
        android:icon="@drawable/ic_done"/>
</menu>

然后,您可以简单地将菜单项的可见性设置为false,在您的oncreateoptionsmmenu()后,膨胀菜单。

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    super.onCreateOptionsMenu(menu, inflater);
    inflater.inflate(menu,R.menu.menu);
    MenuItem item = menu.findItem(R.id.menuItemId);
    if (item != null){
        item.setVisible(false);
    }
}