我有一个带有菜单项的操作栏。如何隐藏/显示菜单项?
这就是我想做的:
MenuItem item = (MenuItem) findViewById(R.id.addAction);
item.setVisible(false);
this.invalidateOptionsMenu();
我有一个带有菜单项的操作栏。如何隐藏/显示菜单项?
这就是我想做的:
MenuItem item = (MenuItem) findViewById(R.id.addAction);
item.setVisible(false);
this.invalidateOptionsMenu();
当前回答
我认为更好的方法是为菜单使用成员变量,在onCreateOptionsMenu()中初始化它,然后只使用setVisible(),而不使选项菜单无效。
其他回答
找到了这个问题的附录:
如果你想要改变菜单项的可见性,你只需要在你的活动中设置一个成员变量来记住你想要隐藏菜单并调用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);
}
}
在我的例子中,我隐藏了所有项目。
是的。
您可以设置标志/条件。 当您想隐藏选项时,调用invalidateOptionsMenu()。这会调用onCreateOptionsMenu()。 在onCreateOptionsMenu()中,检查标志/条件并显示或 隐藏方法如下:
MenuItem item = menu.findItem(R.id.menu_Done); If (flag/condition)) { item.setVisible(假); } else {}
将一个值设置为一个变量并调用invalidateOptionsMenu();
例如
selectedid=arg2;
invalidateOptionsMenu();
public boolean onPrepareOptionsMenu(Menu menu) {
if(selectedid==1){
menu.findItem(R.id.action_setting).setVisible(false);
menu.findItem(R.id.action_s2).setVisible(false);
menu.findItem(R.id.action_s3).setVisible(false);
}
else{
if(selectedid==2){
menu.findItem(R.id.action_search).setVisible(false);
menu.findItem(R.id.action_s4).setVisible(false);
menu.findItem(R.id.action_s5).setVisible(false);
}
}
return super.onPrepareOptionsMenu(menu);
}
对我没用。我必须显式地使用onprepareoptionmenu来设置一个项目不可见。
所以使用onCreateOptionsMenu创建菜单和onPrepareOptionsMenu改变可见性等。
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工作