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

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

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

MenuItem item = (MenuItem) findViewById(R.id.addAction);
item.setVisible(false);
this.invalidateOptionsMenu();

Ответ 1

Получите MenuItem, указывающий на такой элемент, вызовите setVisible на нем, чтобы настроить его видимость, а затем вызовите invalidateOptionsMenu() в своей деятельности, чтобы соответствующим образом настроить меню ActionBar.

Обновление: A MenuItem не является регулярным представлением этой части вашего макета. Это нечто особенное, совершенно другое. Ваш код возвращает null для item и что приводит к сбою. Вместо этого вам нужно сделать:

MenuItem item = menu.findItem(R.id.addAction);

Вот последовательность: первый вызов invalidateOptionsMenu(), а затем внутри onCreateOptionsMenu(Menu) получить ссылку на MenuItem (путем вызова menu.findItem()) и вызвать setVisible() на нем

Ответ 2

Найдено добавление к этому вопросу:

Если вы хотите изменить видимость ваших пунктов меню в пути, вам просто нужно установить переменную-член в своей деятельности, чтобы помнить, что вы хотите скрыть это меню и вызвать 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);
    }
}

В моем примере я скрыл все элементы.

Ответ 3

Да.

  • Вы можете установить флаг/условие.
  • Вызовите invalidateOptionsMenu(), если вы хотите скрыть эту опцию. Это вызовет onCreateOptionsMenu().
  • В onCreateOptionsMenu() проверьте флажок/условие и покажите или скрыть его следующим образом:
MenuItem item = menu.findItem(R.id.menu_Done);

if (flag/condition)) {
  item.setVisible(false); 
} else { }

Ответ 4

Вы можете вызвать это:

MenuItem item = menu.findItem(R.id.my_item);
item.setVisible(false);

Update:

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

Ответ 5

не работал у меня. Я должен был явно использовать onPrepareOptionsMenu, чтобы установить элемент невидимым.

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

Ответ 6

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

Скрыть кнопку по умолчанию в меню 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>

Показать кнопку в коде

Однако кнопка 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;
}

См. также

Ответ 7

Ответ 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);
    }
}

Ответ 8

Это работало для меня как из 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);
}

Ответ 9

Изначально установите видимость элемента меню в 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);
    }
}

Ответ 10

установить значение переменной и вызвать 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);
}

Ответ 11

fooobar.com/questions/27902/... - ответил Look Alterno и Sufian

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

  • Мой someMethod() вызывается из нескольких мест, даже раньше onCreateOptionsMenu(), поэтому я должен проверить mMenu!= null.

  • должен работать с использованием API 8

Ответ 12

Вы можете использовать toolbar.getMenu().clear();, чтобы скрыть сразу все пункты меню

Ответ 13

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

Ответ 14

Согласно официальному сайту разработчиков Android, OnCreateOptionMenu (меню меню) не рекомендуется для изменения элементов меню или значков, видимость..etc во время выполнения.

После того, как система вызывает onCreateOptionsMenu(), она сохраняет экземпляр введенного вами меню и не будет вызывать onCreateOptionsMenu() еще раз, если по какой-либо причине меню недействительно. Однако вы должны использовать onCreateOptionsMenu() только для создания начального состояния меню, а не для внесения изменений в течение жизненного цикла активности.

Если вы хотите изменить меню опций на основе событий, которые происходят во время жизненного цикла активности, вы можете сделать это в методе onPrepareOptionsMenu(). Этот метод передает вам объект Menu, поскольку он существует, поэтому вы можете его изменить, например, добавить, удалить или отключить элементы. (Фрагменты также предоставляют обратный вызов onPrepareOptionsMenu().) - Официальный сайт AndroidDeveloper -

Как рекомендуемый Вы можете использовать этот onOptionsItemSelected (элемент MenuItem) метод отслеживания пользовательских входов.

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

Ответ 15

Для тех, кто использует библиотеку Appcompat: Если в подклассе Activity Action Action (ActionBarActivity) вы можете вызвать supportInvalidateOptionsMenu()

Видел здесь: fooobar.com/questions/27904/...

Ответ 16

Я думаю, что лучшим подходом было бы использовать переменную-член для меню, инициализировать ее в onCreateOptionsMenu() и просто использовать setVisible(), не нарушая при этом меню опций.

Ответ 17

Лучший способ скрыть все элементы в меню только одной командой - использовать "группу" в вашем меню 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       
}

Ответ 18

этот код работал у меня

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