У меня есть панель действий с элементом меню. Как я могу скрыть / показать этот пункт меню?
Это то, что я пытаюсь сделать:
MenuItem item = (MenuItem) findViewById(R.id.addAction); item.setVisible(false); this.invalidateOptionsMenu();
Получите MenuItem
указывающий на такой элемент, вызовите setVisible
на нем, чтобы настроить его видимость, а затем вызовите invalidateOptionsMenu()
в своей деятельности, чтобы соответствующим образом настроить меню ActionBar.
Обновление: MenuItem
не является обычным видом, который является частью вашего макета. Это нечто особенное, совершенно другое. Ваш код возвращает null
для item
и это приводит к сбою. Вместо этого вам нужно сделать следующее:
MenuItem item = menu.findItem(R.id.addAction);
Вот последовательность: первый вызов invalidateOptionsMenu()
а затем внутри onCreateOptionsMenu(Menu)
получить ссылку на MenuItem (вызывая menu.findItem()
) и вызывать 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(false); } else { }
Вы можете назвать это:
MenuItem item = menu.findItem(R.id.my_item); item.setVisible(false);
Обновить:
Убедитесь, что ваш код не возвращает значение null
для item
или может привести к сбою приложения.
Не работал для меня. Мне пришлось явно использовать onPrepareOptionsMenu
чтобы установить элемент невидимым.
Поэтому используйте onCreateOptionsMenu
для создания меню и onPrepareOptionsMenu
для изменения видимости и т. Д.
Я искал ответ с небольшим контекстом. Теперь, когда я это выяснил, я добавлю этот ответ.
По умолчанию кнопка совместного доступа будет скрыта, как установлено 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>
Но кнопка совместного доступа может быть необязательно показана на основе некоторых условий.
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; }
Ответ 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 в вашем onCreateOptionsMenu () после раздувания меню.
public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.menu, menu); menu.findItem(R.id.menuItemId).setVisible(false); return true; }
Это работало для меня как из 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); }
Установить значение переменной и вызвать 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 и суфийский
,
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 () не вызывает обратный вызовPrepareOptionsMenu (); Он просто обновляет меню напрямую.
Мой someMethod () вызывается из нескольких мест, даже до onCreateOptionsMenu (), поэтому я должен проверить mMenu! = Null.
Вы можете использовать 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 и убедитесь, что он существует только в одном файле меню. Если этот ресурс уже используется в любом месте и загружен в действие, он попытается скрыть его.
Для тех, кто использует библиотеку Appcompat: если подклассы Activity ActionBarActivity вы можете вызвать supportInvalidateOptionsMenu ()
Смотрит здесь: https://stackoverflow.com/a/19649877/1562524
Я думаю, что лучшим подходом было бы использовать переменную-член для меню, инициализировать ее в onCreateOptionsMenu () и просто использовать setVisible () после этого, не отменяя меню опций.
Лучший способ скрыть все элементы в меню только одной командой – использовать «группу» в вашем меню xml. Просто добавьте все пункты меню, которые будут в вашем меню переполнения внутри одной группы.
В этом примере у нас есть два пункта меню, которые всегда будут отображаться (обычный элемент и поиск) и три элемента переполнения:
<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 }