Intereting Posts
Как изменить цвет подчеркивания Edittext на 4.0+? Разница Admob между SMART_BANNER и BANNER Android, объектно-ориентированное программирование и проектирование для производительности Отправить Multi Notification в GCM с помощью JSON Запустить виджет из кода Ограничение памяти приложений для Android / iOS (уточнение) и Adobe Air Указанная ориентация не указана, а по умолчанию – горизонтальная. Это общий источник ошибок, когда дети добавляются динамически Активность в Android-активности в одиночной деятельности NotifyDataSetChanged- RecyclerView – это асинхронный вызов? Тестирование, что действие было начато с FLAG_ACTIVITY_CLEAR_TOP Как можно центрировать два текстовых элемента по вертикали в макете Изменение макета Android от относительного к линейному Android-тестирование устройства с ошибкой Robolectric throws AndroidManifest.xml не найдено или не файл Ошибка сборки многострочной градации: пакет не существует Google Glass не входит в число Android-устройств от ADB

Как скрыть пункт меню на панели действий?

У меня есть панель действий с элементом меню. Как я могу скрыть / показать этот пункт меню?

Это то, что я пытаюсь сделать:

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

В моем примере я спрятал все предметы.

Да.

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

Обновить:

Убедитесь, что ваш код не возвращает значение null для item или может привести к сбою приложения.

Не работал для меня. Мне пришлось явно использовать onPrepareOptionsMenu чтобы установить элемент невидимым.

Поэтому используйте onCreateOptionsMenu для создания меню и onPrepareOptionsMenu для изменения видимости и т. Д.

Я искал ответ с небольшим контекстом. Теперь, когда я это выяснил, я добавлю этот ответ.

Скрыть кнопку по умолчанию в меню xml

По умолчанию кнопка совместного доступа будет скрыта, как установлено 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; } 

Смотрите также

  • Настройка панели приложений (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); } } 

Вы можете просто установить видимость пункта меню на 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 и суфийский

  • ActivityCompat.invalidateOptionsMenu () не вызывает обратный вызовPrepareOptionsMenu (); Он просто обновляет меню напрямую.
  • Мой 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 () не вызывает обратный вызовPrepareOptionsMenu (); Он просто обновляет меню напрямую.

  • Мой 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 и убедитесь, что он существует только в одном файле меню. Если этот ресурс уже используется в любом месте и загружен в действие, он попытается скрыть его.

Для тех, кто использует библиотеку 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 }