У меня есть панель действий с меню. Как я могу Скрыть/показать пункт меню?
Это то, что я'м пытаюсь сделать:
MenuItem item = (MenuItem) findViewById(R.id.addAction);
item.setVisible(false);
this.invalidateOptionsMenu();
Вам в меню
, которое указывает на такой элемент, называют функцию setvisible на него, чтобы настроить его видимость, а затем позвонить invalidateOptionsMenu()` от вашей активности, так что меню ActionBar окрашивается соответствующим образом скорректированы.
Обновление: в меню
- это не обычный вид, что's частью вашего макета. Его что-то особенное, совершенно иной. Значение null возвращается код `для
вещи` и что's причиной аварии. Вместо этого вам нужно сделать:
MenuItem item = menu.findItem(R.id.addAction);
Вот последовательность, в которой вы должны вызвать:
сначала позвонить invalidateOptionsMenu()и
onCreateOptionsMenu(меню)получаем ссылку на объект MenuItem (по меню вызова
.метод 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);
}
}
В моем примере я'вэ скрыты все детали.
Да.
onCreateOptionsMenu()
.По пункту меню = Меню.метод finditem(ИД Р..menu_Done);
если (флаг/условие)) { элемента.функцию setvisible(ложь); } еще { }
Вы можете назвать это:
MenuItem item = menu.findItem(R.id.my_item);
item.setVisible(false);
Обновление:
Убедитесь, что ваш код не'т возвращает значение null
в вещи
, или может произойти сбой приложения.
Я искала ответ с немного больше контекста. Теперь, когда я понял это, я добавлю, что ответить.
Кнопка #скрыть по умолчанию в меню XML
По умолчанию кнопка "Поделиться" будет скрыто, Как установить на Андроид:видна=то"ложные"`в.
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>
Кнопка Показать #в код
Но кнопка Share при необходимости может быть показано на основе некоторого условия.
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;
}
я't работа для меня. Мне пришлось явно использовать onPrepareOptionsMenu
, чтобы установить элемент невидимым.
Так что используйте onCreateOptionsMenu
для создания onPrepareOptionsMenu меню и изменять видимость и т. д.
Это работало для меня, как активность и фрагмент
@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>
Затем вы можете просто установить видимость пункта меню на "false" в onCreateOptionsMenu() после накачивания меню.
@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);
}
}
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);
}
}
Попробуйте это:
MenuItem myitem = menu.findItem(R.id.my_item);
myitem.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);
}
Установив видимость всех элементов в меню, меню приложения или меню будет автоматически скрывать
Пример
private Menu menu_change_language;
...
...
@Override
public boolean onCreateOptionsMenu(Menu menu) {
...
...
menu_change_language = menu;
menu_change_language.findItem(R.id.menu_change_language)
.setVisible(true);
return super.onCreateOptionsMenu(menu);
}
Прежде чем обращаться к другим использовать фрагмент кода ниже:
if(menu_change_language != null){
menu_change_language.findItem(R.id.menu_change_language)
.setVisible(false);
}
Вы можете использовать панель инструментов.аксессуар является().очистить ();`, чтобы скрыть все пункты меню сразу
По данным официального сайта разработчика для Android,OnCreateOptionMenu(меню) не рекомендуется изменять пункты меню или иконки, прозрачность и т. д. Во время выполнения.
после системных вызовов onCreateOptionsMenu(), он сохраняет экземпляр меню вы заполнить и не буду называть onCreateOptionsMenu (снова), если меню становится недействительным по какой-то причине. Однако, вы должны использовать onCreateOptionsMenu() только для создания начального состояния меню и не вносить изменения в ходе жизненного цикла Activity.
если вы хотите изменить в меню "Параметры", основанного на событиях, которые происходят в течение жизненного цикла Activity, вы можете сделать это в onPrepareOptionsMenu() метод. Этот метод передает вам объект в меню, как это в настоящее время не существует, поэтому его можно изменять, например, добавить, удалить, или отключить элементы. (Фрагменты также предоставляют onPrepareOptionsMenu() обратного вызова.) --Официальный Сайт AndroidDeveloper --
Как рекомендуется, вы можете использовать этот onoptionsitemselected(пункт меню) способ отслеживать действия пользователя.
@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;
}
https://stackoverflow.com/a/21215280/466363 - ответил на взгляд Альтерно и Суфьян
.
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() не'т обратного вызова onPrepareOptionsMenu(); это просто обновить меню.
Моя метода someMethod() вызывается из нескольких мест, даже до onCreateOptionsMenu(), так что я должен проверить мрнению != значение null.
должен работать через API 8
Если вы все сделали как в ответы выше, но пункт меню по-прежнему отображается, проверьте, что вы ссылаетесь на уникальный ресурс. Например, в onCreateOptionsMenu или onPrepareOptionsMenu
@Override
public void onPrepareOptionsMenu(Menu menu) {
super.onPrepareOptionsMenu(menu);
MenuItem menuOpen = menu.findItem(R.id.menu_open);
menuOpen.setVisible(false);
}
Ctrl+клик код Р..menu_open и проверить, что он существует только в одном меню Файл. В случае, когда этот ресурс уже использован в любом месте и загружается в деятельность, он будет пытаться спрятаться там.
Я думаю, что лучшим подходом было бы использовать переменную-член для меню, инициализировать его в onCreateOptionsMenu() и просто использовать setvisible() после этого, без признания недействительными в меню "Параметры".
Для тех, кто использует библиотеку совместимости приложений: Если ваша деятельность подклассы ActionBarActivity, вы можете позвонить supportInvalidateOptionsMenu()
Посмотреть здесь: https://stackoverflow.com/a/19649877/1562524
Лучший способ скрыть все элементы в меню с помощью всего одной команды является использование и"группы" на ваш 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
}
Если вы хотите использовать эту команду где-нибудь еще на вашу активность, обязательно сохраните класса меню для местных, и всегда проверяйте, если меню имеет значение null, потому что вы можете выполнять до 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
}
этот код работал для меня
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main_menu,menu);
if (Application.sharedPreferences.getInt("type",1) == 2)
{
menuItem = menu.findItem(R.id.menu_travel_orders);
menuItem.setVisible(false);
}
return super.onCreateOptionsMenu(menu);
}