Получите MenuItem
указатель на такой элемент, вызовите setVisible
его, чтобы настроить его видимость, а затем вызовите invalidateOptionsMenu()
свою активность, чтобы соответственно изменить меню ActionBar.
Обновление: A MenuItem
- это не обычный вид, который является частью вашего макета. Это что-то особенное, совершенно другое. Ваш код возвращается null
для item
и это вызывает сбой. Вместо этого вам нужно сделать следующее:
MenuItem item = menu.findItem(R.id.addAction);
Вот последовательность, в которой вы должны позвонить: сначала позвоните, invalidateOptionsMenu()
а затем внутри onCreateOptionsMenu(Menu)
получите ссылку на MenuItem (путем вызова menu.findItem()
) и вызовите setVisible()
его
MenuItem
можете быть,null
потому что вы используетеgetItem
вместоfindItem
. Мы никогда не узнаем, не увидев ни ваш код, ни журнал сбоев.onCreateOptionsMenu
и настройте видимость элемента в этой точке. Или держите ссылку рядом, пока вы не решите, должна ли она быть видимой или нет.invalidateOptionsMenu()
а затем внутриonCreateOptionsMenu(Menu)
получить ссылку наMenuItem
(путем вызоваmenu.findItem()
) и вызватьsetVisible()
ее. Ответы suhas_sm и P1r4nh4 представляют правильный подход.Нашел дополнение к этому вопросу:
Если вы хотите изменить видимость своих пунктов меню на ходу, вам просто нужно установить переменную-член в своей деятельности, чтобы помнить, что вы хотите скрыть меню и вызывать
invalidateOptionsMenu()
и скрывать элементы в переопределенномonCreateOptionsMenu(...)
методе.В моем примере я спрятал все предметы.
источник
if (HIDE_MENU) { return false; } else { getSupportMenuInflater().inflate(R.menu.menu_settings, menu); return true; }
Состояние документа: «Вы должны вернуть true, чтобы меню отображалось; если вы вернете false, оно не будет отображаться».onPrepareOptionsMenu()
следует использовать для логики «показать / скрыть», а неonCreateOptionsMenu()
потому, что она вызывается только один раз, поэтому бесполезно, если вы хотите изменить пункты меню после его инициализации. Так что надуйте в onCreate, но покажите / скройте в onPrepare.Да.
invalidateOptionsMenu()
когда хотите скрыть опцию. Это позвонитonCreateOptionsMenu()
.onCreateOptionsMenu()
, проверьте флаг / условие и покажите или спрячьте его следующим образом:источник
invalidateOptionsMenu
вместоinvalidateOptions
?onCreateOptionsMenu
Вы можете назвать это:
Обновить:
Убедитесь , что ваш код не возвращается
null
наitem
или может произойти сбой приложения.источник
Я искал ответ с немного большим контекстом. Теперь, когда я понял это, я добавлю этот ответ.
Скрыть кнопку по умолчанию в меню xml
По умолчанию кнопка «Поделиться» будет скрыта, как установлено
android:visible="false"
.main_menu.xml
Показать кнопку в коде
Но кнопка «Поделиться» может отображаться в зависимости от некоторых условий.
MainActivity.java
Смотрите также
источник
invalidateOptionsMenu()
для обновления меню.не работал для меня Я должен был явно использовать
onPrepareOptionsMenu
чтобы установить элемент невидимым.Так что используйте
onCreateOptionsMenu
для создания меню иonPrepareOptionsMenu
изменения видимости и т. Д.источник
onPrepareOptionsMenu
кажется подходящим местом для выполнения этого типа операции: «Подготовьте стандартное меню параметров экрана для отображения. Это вызывается прямо перед отображением меню, каждый раз, когда оно отображается . Вы можете использовать этот метод, чтобы эффективно включать / отключать элементы или иным образом динамически изменять содержимое. "invalidateOptionsMenu()
для обновления меню.Изначально установите видимость пункта меню в false в файле макета меню следующим образом:
Затем вы можете просто установить видимость элемента меню в false в вашем onCreateOptionsMenu () после надувания меню.
источник
Попробуй это:
источник
Это сработало для меня как из Activity, так и из Fragment
источник
Ответ P1r4nh4 работает нормально, я просто упростил его, используя логический флаг:
источник
0
и1
не является «логическим флагом», а псевдо-логическим. кроме того, здесь нет причин использовать реальное логическое значение.Согласно официальному сайту разработчика Android, OnCreateOptionMenu (Меню меню) не рекомендуется для изменения пунктов меню или значков, видимости и т. Д. Во время выполнения.
Как рекомендуется Вы можете использовать этот метод onOptionsItemSelected (элемент MenuItem) для отслеживания пользовательских вводов.
Если вам нужно изменить элементы меню во время выполнения, вы можете использовать onPrepareOptionsMenu (Меню меню), чтобы изменить их
источник
setVisible(false)
обозначаю всегда видимый элемент, он не исчезает, пока я не нажму на три точки (само меню). Если я используюinvalidateOptionsMenu()
вonPrepareOptionsMenu
элементах сразу же реорганизовать себя, но они теряют свои действия (если я нажимаю на любой элемент, это ничего не делает).установить значение переменной и вызвать invalidateOptionsMenu ();
например
источник
setVisible(false)
обозначаю всегда видимый элемент, он не исчезает, пока я не нажму на три точки (само меню). Если я используюinvalidateOptionsMenu()
вonPrepareOptionsMenu
элементах сразу же реорганизовать себя, но они теряют свои действия (если я нажимаю на любой элемент, это ничего не делает).Вы можете использовать,
toolbar.getMenu().clear();
чтобы скрыть все пункты меню одновременноисточник
При настройке видимости всех элементов в меню, меню панели приложений или переполнение будет автоматически скрывать
пример
...
...
Прежде чем перейти к другому фрагменту, используйте приведенный ниже код:
источник
https://stackoverflow.com/a/21215280/466363 - ответ от Look Alterno и Sufian
,
ActivityCompat.invalidateOptionsMenu () не выполняет обратный вызов onPrepareOptionsMenu (); это просто обновить меню напрямую.
Мой someMethod () вызывается из нескольких мест, даже до onCreateOptionsMenu (), поэтому я должен проверить mMenu! = Null.
источник
Если вы сделали все как в ответах выше, но пункт меню все еще виден, проверьте, что вы ссылаетесь на уникальный ресурс. Например, в onCreateOptionsMenu или onPrepareOptionsMenu
Ctrl + клик R.id.menu_open и убедитесь, что он существует только в одном файле меню. В случае, если этот ресурс уже используется где-либо и загружен в действие, он попытается скрыться там.
источник
Лучший способ скрыть все элементы в меню с помощью одной команды - использовать «group» в вашем меню xml. Просто добавьте все пункты меню, которые будут в вашем меню переполнения в той же группе.
В этом примере у нас есть два элемента меню, которые будут всегда отображаться (обычный элемент и поиск) и три элемента переполнения:
Затем в своей деятельности (предпочтительно в onCreateOptionsMenu) используйте команду setGroupVisible, чтобы установить для всех элементов меню видимость false или true.
Если вы хотите использовать эту команду где-либо еще в своей деятельности, не забудьте сохранить класс меню в локальном и всегда проверять, имеет ли меню значение null, потому что вы можете выполнить его до createOptionsMenu:
источник
Для тех, кто использует библиотеку Appcompat: Если ваши подклассы Activity ActionBarActivity, вы можете вызвать supportInvalidateOptionsMenu ()
Видно здесь: https://stackoverflow.com/a/19649877/1562524
источник
Я думаю, что лучшим подходом было бы использовать переменную-член для меню, инициализировать ее в onCreateOptionsMenu () и потом просто использовать setVisible (), не аннулируя меню опций.
источник
этот код работал для меня
источник
Этот подход работал для меня:
источник
Вы пытаетесь получить доступ к элементу меню из действия, которое не имеет доступа к области действия. Вызов, чтобы найти пункт меню, вернет ноль , потому что представление не связано ни с деятельностью, ни с макетом, из которого вы вызываете.
Пункты меню связаны с такими элементами, как «Панель навигации », которые, в свою очередь, связаны с соответствующим действием.
Поэтому инициализируйте эти представления в Activity (), а затем получите доступ к пунктам меню в этих представлениях.
источник
использование
invalidateOptionsMenu()
для того, чтобы позвонить
onPrepareOptionsMenu(menu: Menu?)
https://developer.android.com/guide/topics/ui/menus
источник
источник