我有一个带有菜单项的操作栏。如何隐藏/显示菜单项?
这就是我想做的:
MenuItem item = (MenuItem) findViewById(R.id.addAction);
item.setVisible(false);
this.invalidateOptionsMenu();
我有一个带有菜单项的操作栏。如何隐藏/显示菜单项?
这就是我想做的:
MenuItem item = (MenuItem) findViewById(R.id.addAction);
item.setVisible(false);
this.invalidateOptionsMenu();
当前回答
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工作
其他回答
最初在菜单布局文件中将菜单项可见性设置为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);
}
}
用一个命令隐藏菜单中所有项的最好方法是在菜单xml中使用“group”。只需将溢出菜单中的所有菜单项添加到同一组中即可。
在这个例子中,我们有两个永远显示的菜单项(常规项和搜索项)和三个溢出项:
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/someItemNotToHide1"
android:title="ITEM"
app:showAsAction="always" />
<item
android:id="@+id/someItemNotToHide2"
android:icon="@android:drawable/ic_menu_search"
app:showAsAction="collapseActionView|ifRoom"
app:actionViewClass="android.support.v7.widget.SearchView"
android:title="Search"/>
<group android:id="@+id/overFlowItemsToHide">
<item android:id="@+id/someID"
android:orderInCategory="1" app:showAsAction="never" />
<item android:id="@+id/someID2"
android:orderInCategory="1" app:showAsAction="never" />
<item android:id="@+id/someID3"
android:orderInCategory="1" app:showAsAction="never" />
</group>
</menu>
然后,在您的活动(首选在oncreateoptionsmmenu),使用命令setGroupVisible设置所有菜单项可见性为false或true。
public boolean onCreateOptionsMenu(Menu menu) {
menu.setGroupVisible(R.id.overFlowItems, false); // Or true to be visible
}
如果你想在活动的其他地方使用这个命令,请确保将菜单类保存到本地,并始终检查菜单是否为空,因为你可以在createOptionsMenu之前执行:
Menu menu;
public boolean onCreateOptionsMenu(Menu menu) {
this.menu = menu;
}
public void hideMenus() {
if (menu != null) menu.setGroupVisible(R.id.overFlowItems, false); // Or true to be visible
}
通过设置菜单中所有项目的可见性,应用程序栏菜单或溢出菜单将自动隐藏
例子
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);
}
这在《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);
}
我认为更好的方法是为菜单使用成员变量,在onCreateOptionsMenu()中初始化它,然后只使用setVisible(),而不使选项菜单无效。