如何在操作栏中隐藏菜单项?

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

这就是我想做的:

MenuItem item = (MenuItem) findViewById(R.id.addAction);
item.setVisible(false);
this.invalidateOptionsMenu();
379563 次浏览

获得一个指向该项目的MenuItem,在它上调用setVisible来调整它的可见性,然后在你的活动上调用invalidateOptionsMenu(),这样动作栏菜单就会相应调整。

MenuItem不是一个常规视图,它是布局的一部分。它很特别,完全不同。你的代码为item返回null,这导致了崩溃。你需要做的是:

MenuItem item = menu.findItem(R.id.addAction);
下面是你应该调用的序列: 首先调用invalidateOptionsMenu(),然后在onCreateOptionsMenu(Menu)内部获得对MenuItem的引用(通过调用menu.findItem()),并对它调用setVisible()

你可以调用它:

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

更新:

确保你的代码没有为item返回null,否则会导致应用程序崩溃。

是的。

  1. 您可以设置标志/条件。
  2. 当你想隐藏这个选项时,调用invalidateOptionsMenu()。这将调用onCreateOptionsMenu()
  3. onCreateOptionsMenu()中,检查flag/条件并显示或 隐藏它的方式如下:
MenuItem item = menu.findItem(R.id.menu_Done);


if (flag/condition)) {
item.setVisible(false);
} else { }

找到了这个问题的附录:

如果你想改变你的菜单项的可见性,你只需要在你的活动中设置一个成员变量来记住你想隐藏菜单,并调用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);
}
}

在我的例子中,我隐藏了所有项目。

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

最初在菜单布局文件中将菜单项可见性设置为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);
}
}

对我没用。我必须显式地使用onPrepareOptionsMenu将项设置为不可见。

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

将一个值设置为一个变量并调用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);
}

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

  • activitycompatat . invalidateoptionsmenu()不回调 onPrepareOptionsMenu ();它只是直接更新菜单 我的someMethod()从几个地方被调用,甚至在之前 oncreateoptionsmmenu(),所以我必须检查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());
}
}
...
}
  • activitycompatat . invalidateoptionsmenu()不回调 onPrepareOptionsMenu ();

  • My someMethod()从几个地方被调用,甚至之前 onCreateOptionsMenu(),所以我必须检查mMenu != null.

  • 应该使用API 8工作
对于那些使用Appcompat库的人: 如果你的Activity子类ActionBarActivity,你可以调用supportInvalidateOptionsMenu()

< p >所示: https://stackoverflow.com/a/19649877/1562524 < / p >

这在《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);
}

我在寻找一个更有背景的答案。现在我已经弄清楚了,我将添加这个答案。

在菜单xml中默认隐藏按钮

默认情况下,共享按钮将被隐藏,就像android:visible="false"设置的那样。

enter image description here

main_menu.xml

<?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">


<!-- hide share button by default -->
<item
android:id="@+id/menu_action_share"
android:icon="@drawable/ic_share_white_24dp"
android:visible="false"
android:title="Share"
app:showAsAction="always"/>


<item
android:id="@+id/menu_action_settings"
android:icon="@drawable/ic_settings_white_24dp"
android:title="Setting"
app:showAsAction="ifRoom"/>


</menu>

代码中显示按钮

但是可以根据某些条件选择显示共享按钮。

enter image description here

MainActivity.java

public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.main_menu, menu);
MenuItem shareItem = menu.findItem(R.id.menu_action_share);


// show the button when some condition is true
if (someCondition) {
shareItem.setVisible(true);
}


return true;
}

另请参阅

你可以使用toolbar.getMenu().clear();一次性隐藏所有菜单项

如果你按照上面的答案做了所有事情,但是菜单项仍然可见,检查你引用了独特的资源。 例如,在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并检查它是否只存在于一个菜单文件中。如果这个资源已经在任何地方使用并加载在一个活动中,它将尝试隐藏在那里。

我认为更好的方法是为菜单使用成员变量,在onCreateOptionsMenu()中初始化它,然后只使用setVisible(),而不使选项菜单无效。

用一个命令隐藏菜单中所有项的最好方法是在菜单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
}

根据Android开发者官方网站,OnCreateOptionMenu(菜单菜单)不建议在运行时更改菜单项或图标,可见性等。

在系统调用onCreateOptionsMenu()后,它会保留您填充的菜单实例,并且不会再次调用onCreateOptionsMenu(),除非菜单因某种原因失效。但是,你应该只使用onCreateOptionsMenu()来创建初始菜单状态,而不是在活动生命周期中进行更改。

如果你想根据活动生命周期中发生的事件来修改选项菜单,你可以在onprepareoptionsmmenu()方法中这样做。此方法向您传递当前存在的Menu对象,以便您可以修改它,例如添加、删除或禁用项。(fragment也提供了一个onprepareoptionmenu()回调。) ——AndroidDeveloper官方网站—— < / p >

你可以使用这个onOptionsItemSelected(子菜单项)方法跟踪用户输入。

@Override
public boolean onOptionsItemSelected(MenuItem item) {


int id = item.getItemId();


if (id == R.id.edit) {
Intent intent = new Intent(this, ExampleActivity.class);
intent.putExtra(BUNDLE_KEY, mConnection);
startActivityForResult(intent, PICK_CHANGE_REQUEST);
return true;
} else if (id == R.id.delete) {
showDialog(this);
return true;
}


return super.onOptionsItemSelected(item);
}

如果你需要在运行时更改菜单项,你可以使用onPrepareOptionsMenu菜单(菜单)来更改它们

@Override
public boolean onPrepareOptionsMenu(Menu menu){


if (Utils.checkNetworkStatus(ExampleActivity.this)) {
menu.findItem(R.id.edit).setVisible(true);
menu.findItem(R.id.delete).setVisible(true);
}else {
menu.findItem(R.id.edit).setVisible(false);
menu.findItem(R.id.delete).setVisible(false);
}
return true;
}

这个代码对我有用

@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main_menu,menu);
if (Application.sharedPreferences.getInt("type",1) == 2)
{
menuItem = menu.findItem(R.id.menu_travel_orders);
menuItem.setVisible(false);
}
return super.onCreateOptionsMenu(menu);
}

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

例子

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

这个方法对我很有效:

private  Menu thismenu;


if (condition)
{
if(thismenu != null)
{
thismenu.findItem(R.id.menu_save).setVisible(true);
Toast.makeText(ProfileActivity.this,
""+thismenu.findItem(R.id.menu_save).getTitle(),
Toast.LENGTH_SHORT).show();
}else
{
thismenu.findItem(R.id.menu_save).setVisible(false);
}
}


@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.profile_menu, menu);
thismenu = menu;


return true;
}

试试这个:

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

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

菜单项与诸如"导航栏"之类的项绑定,而"导航栏"又与相应的活动绑定。

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

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


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

使用invalidateOptionsMenu()

以便调用onPrepareOptionsMenu(menu: Menu?)

你应该使用onCreateOptionsMenu()只创建初始菜单状态,而不是在活动生命周期中进行更改…

当一个事件发生并且你想要执行菜单更新时,你必须调用invalidateOptionsMenu()来请求系统调用onPrepareOptionsMenu()。

https://developer.android.com/guide/topics/ui/menus

Android kotlin,隐藏或设置操作栏中菜单项的可见性。

override fun onCreateOptionsMenu(menu: Menu): Boolean {
val inflater = menuInflater
inflater.inflate(R.menu.main_menu, menu)
val method = menu.findItem(R.id.menu_method)
method.isVisible = false //if want to show set true
return super.onCreateOptionsMenu(menu)
}

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

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

这对我来说很管用;我希望它能帮助你:

@Override
public boolean onCreateOptionsMenu(final Menu menu) {
getMenuInflater().inflate(R.menu.my_menu_setting, menu);


for (int i = 0; i < menu.size(); i++){
if(menu.getItem(i).getItemId() == R.id.this_item_i_want_to_hide){
menu.getItem(i).setVisible(false);
}
}


return true;
}