如何隐藏操作栏中的菜单项?
我有一个菜单项的操作栏。 我怎样才能隐藏/显示菜单项?
这就是我想要做的:
MenuItem item = (MenuItem) findViewById(R.id.addAction); item.setVisible(false); this.invalidateOptionsMenu();
得到一个指向这个项目的MenuItem
,调用setVisible
来调整它的可见性,然后在你的activity上调用invalidateOptionsMenu()
,这样就可以相应地调整ActionBar菜单。
更新:一个MenuItem
不是一个常规的视图,这是你的布局的一部分。 它的东西特别,完全不同。 你的代码返回null
的item
,这是导致崩溃。 你需要的是做:
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); } }
在我的例子中,我隐藏了所有的项目。
是。
- 你可以设置一个标志/条件。
- 当你想隐藏选项时调用
invalidateOptionsMenu()
。 这将调用onCreateOptionsMenu()
。 - 在
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);
更新:
确保你的代码不会返回null
的item
或它可能会崩溃的应用程序。
没有为我工作。 我不得不明确使用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 }