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

我有一个菜单项的操作栏。 我怎样才能隐藏/显示菜单项?

这就是我想要做的:

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

得到一个指向这个项目的MenuItem ,调用setVisible来调整它的可见性,然后在你的activity上调用invalidateOptionsMenu() ,这样就可以相应地调整ActionBar菜单。

更新:一个MenuItem不是一个常规的视图,这是你的布局的一部分。 它的东西特别,完全不同。 你的代码返回nullitem ,这是导致崩溃。 你需要的是做:

 MenuItem item = menu.findItem(R.id.addAction); 

这里是顺序:首先调用invalidateOptionsMenu() ,然后在onCreateOptionsMenu(Menu)获取对MenuItem的引用(通过调用menu.findItem() )并调用setVisible()

find这个问题的附录:

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

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

是。

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

你可以调用这个:

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

更新:

确保你的代码不会返回nullitem或它可能会崩溃的应用程序。

没有为我工作。 我不得不明确使用onPrepareOptionsMenu来设置一个项目不可见。

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

我正在寻找一个更多的上下文的答案。 现在我已经知道了,我会添加这个答案。

在菜单xml中默认隐藏button

默认情况下,共享button将被隐藏,由android:visible="false"

在这里输入图像描述

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> 

在代码中显示button

但是分享button可以根据某些条件来select显示。

在这里输入图像描述

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

也可以看看

  • 设置应用栏 (Android文档,帮助获取应用/操作栏设置)

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

这对我来说既是活动和片段

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

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

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

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

设置一个值为一个variables,并调用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回答

  • ActivityCompat.invalidateOptionsMenu()不callbackonPrepareOptionsMenu(); 它只是直接更新菜单。
  • 我的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()); } } ... } 
  • ActivityCompat.invalidateOptionsMenu()不callbackonPrepareOptionsMenu(); 它只是直接更新菜单。

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

  • 应该使用API​​ 8

你可以使用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并检查它是否只存在于一个菜单文件中。 如果这个资源已经在任何地方使用,并加载到一个活动,它会试图隐藏在那里。

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

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

如果要根据活动生命周期中发生的事件修改选项菜单,可以在onPrepareOptionsMenu()方法中执行此操作。 这个方法传递给你当前存在的Menu对象,所以你可以修改它,比如添加,删除或者禁用项目。 (片段还提供了一个onPrepareOptionsMenu()callback。)– AndroidDeveloper官方网站 –

作为推荐您可以使用此onOptionsItemSelected(MenuItem项目)方法跟踪用户input。

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

对于那些使用Appcompat库的人:如果你的Activity的子类是ActionBarActivity,你可以调用supportInvalidateOptionsMenu()

看到这里: https : //stackoverflow.com/a/19649877/1562524

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

使用一个命令隐藏菜单中所有项目的最好方法是使用菜单xml中的“group”。 只需添加将在同一组内的溢出菜单中的所有菜单项。

在这个例子中,我们有两个菜单项将永远显示(常规项目和search)和三个溢出项目:

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

然后,在您的活动(最好在onCreateOptionsMenu)上,使用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 }