我有一个带有菜单项的操作栏。如何隐藏/显示菜单项?
这就是我想做的:
MenuItem item = (MenuItem) findViewById(R.id.addAction);
item.setVisible(false);
this.invalidateOptionsMenu();
我有一个带有菜单项的操作栏。如何隐藏/显示菜单项?
这就是我想做的:
MenuItem item = (MenuItem) findViewById(R.id.addAction);
item.setVisible(false);
this.invalidateOptionsMenu();
当前回答
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);
}
}
其他回答
获取一个指向这样的菜单项,调用setVisible来调整它的可见性,然后在你的活动上调用invalidateOptionsMenu(),这样动作栏菜单就会相应调整。
更新:菜单项不是常规视图,它是布局的一部分。它很特别,完全不同。你的代码为item返回null,这导致了崩溃。你需要做的是:
MenuItem item = menu.findItem(R.id.addAction);
下面是你应该调用的顺序: 首先调用invalidateOptionsMenu(),然后在onCreateOptionsMenu(Menu)内部获得对MenuItem的引用(通过调用Menu . finditem())并在其上调用setVisible()
您正在尝试从一个活动中访问一个菜单项,该活动没有访问范围的权限。查找菜单项的调用将返回null,因为视图既没有与您调用的活动绑定,也没有与您调用的布局绑定。
菜单项与“导航栏”等项绑定,而“导航栏”又与相应的活动绑定。
因此在activity()中初始化这些视图,然后在这些视图中访问菜单项。
Navigation navView;
navView = findViewById(R.id.navigationView);
MenuItem item = navView.getMenu().findItem(R.id.item_hosting);
item.setVisible(false);
你可以调用它:
MenuItem item = menu.findItem(R.id.my_item);
item.setVisible(false);
更新:
确保您的代码不为item返回null,否则可能导致应用程序崩溃。
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()。 在onCreateOptionsMenu()中,检查标志/条件并显示或 隐藏方法如下:
MenuItem item = menu.findItem(R.id.menu_Done); If (flag/condition)) { item.setVisible(假); } else {}