Скрыть / показать пункт меню Опции панели действий для различных фрагментов

У меня есть активность фрагмента Шерлока, в котором есть 3 фрагмента.

фрагмент A, фрагмент B, фрагмент C - это три фрагмента. Я хочу показать меню "готово" только во фрагменте B.

и действие начинается с фрагмента A. При выборе фрагмента B добавляется кнопка "готово".

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setHasOptionsMenu(true);
}

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    if(!menusInflated){
        inflater.inflate(R.menu.security, menu);
        menusInflated=true;
    }

    super.onCreateOptionsMenu(menu, inflater);
}

когда я снова запускаю фрагмент A, я хочу, чтобы меню опций было сделано (которое было установлено на фрагменте B) для этого я делаю так

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

но это не скрывается вообще, а также дает исключение NullPointerException, когда действие, если сначала началось с фрагмента A.

пожалуйста, дайте мне знать в чем проблема.

11 ответов


Это один из способов сделать это:

добавить "группу" в меню:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >

    <group
        android:id="@+id/main_menu_group">
         <item android:id="@+id/done_item"
              android:title="..."
              android:icon="..."
              android:showAsAction="..."/>
    </group>
</menu>

затем добавьте

Menu menu;

переменная для вашей деятельности и установите ее в переопределении onCreateOptionsMenu:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    this.menu = menu;
    // inflate your menu here
}

после, добавить и использовать эту функцию для вашей деятельности, когда вы хотите, чтобы показать/скрыть меню:

public void showOverflowMenu(boolean showMenu){
    if(menu == null)
        return;
    menu.setGroupVisible(R.id.main_menu_group, showMenu);
}

Я не говорю, что это лучший/единственный способ, но это работает хорошо для меня.


попробуйте это...

вам не нужно снова переопределять onCreateOptionsMenu() в вашем классе фрагментов. Видимость элементов меню может быть изменена путем переопределения метода onPrepareOptionsMenu (), доступного в классе фрагментов.

 @Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setHasOptionsMenu(true);
}
@Override
public void onPrepareOptionsMenu(Menu menu) {
    menu.findItem(R.id.action_search).setVisible(false);
    super.onPrepareOptionsMenu(menu);
}

чтобы показать элементы действий (кнопки действий) в ActionBar фрагментов, где они только необходимы, сделайте следующее:

допустим, вы хотите, чтобы save кнопка для отображения только во фрагменте, где вы принимаете ввод для элементов, а не во фрагменте, где вы просматриваете список элементов, добавьте это в OnCreateOptionsMenu метод фрагмента, в котором вы просматриваете элементы:

public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {

    if (menu != null) {

        menu.findItem(R.id.action_save_item).setVisible(false);
    }
}

Примечание: для этого, чтобы работать, вам нужно onCreate() способ в вашем фрагменте (где вы хотите кнопка скрыть элемент, фрагмент представления элемента в нашем примере) и добавить setHasOptionsMenu(true) такой:

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setHasOptionsMenu(true);
}

может быть, не лучший вариант, но он работает, и это просто.


Это будет работать, я думаю...

// Declare
Menu menu;
MenuItem menuDoneItem;

// Then in your onCreateOptionMenu() method write the following...
@Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        this.menu=menu;
        inflater.inflate(R.menu.secutity, menu);
            }

// In your onOptionItemSelected() method write the following...
@Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case R.id.done_item:
                this.menuDoneItem=item;
                someOperation();
                return true;
            default:
                return super.onOptionsItemSelected(item);
        }
    }

// Now Making invisible any menu item...
public void menuInvisible(){
setHasOptionsMenu(true);// Take part in populating the action bar menu
            menuDoneItem=(MenuItem)menu.findItem(R.id.done_item);
                menuRefresh.setVisible(false); // make true to make the menu item visible.
}

//Use the above method whenever you need to make your menu item visible or invisiable

вы также можете ссылаться на это ссылке для более подробной информации, это очень полезно.


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

для получения дополнительной информации см.: http://androiddhina.blogspot.in/2015/05/android-how-to-hide-menu-item-in.html


попробуй такое

@Override
public boolean onCreateOptionsMenu(Menu menu){
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.custom_actionbar, menu);
    menu.setGroupVisible(...);
}

вы можете сделать меню для каждого фрагмента и глобальную переменную, которая отмечает, какой фрагмент используется сейчас. и проверьте значение переменной в onCreateOptionsMenu и надуйте правильное меню

 @Override
     public boolean onCreateOptionsMenu(Menu menu) {
         if (fragment_it == 6) {
             MenuInflater inflater = getMenuInflater();
             inflater.inflate(R.menu.custom_actionbar, menu);
         }
     } 

несмотря на то, что вопрос старый и ответил. Есть более простой ответ, чем упомянутая выше. Вам не нужно использовать другие переменные. Вы можете создавать кнопки на панели действий независимо от того, какой фрагмент вы хотите, вместо того, чтобы делать видимость(Показать/Скрыть).

добавьте в фрагмент следующее, что вам нужно в пункте меню.

public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    inflater.inflate(R.menu.menu, menu);
    super.onCreateOptionsMenu(menu, inflater);
}

примерное меню.xml-файл:

<menu xmlns:android="http://schemas.android.com/apk/res/android" >
    <item
        android:id="@+id/action_addFlat"
        android:icon="@drawable/add"
        android:showAsAction="ifRoom|withText"
        android:title="@string/action_addFlat"/>
</menu>

обработка событий onclick, как обычно.


Привет, я получил лучшее решение этого, предположим, если вам нужно скрыть конкретный элемент в методе создания меню и показать этот элемент в другом фрагменте. Я беру пример два пункта меню Правка и удалить. e.G меню xml приведено ниже:

sell_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">

<item
    android:id="@+id/action_edit"
    android:icon="@drawable/ic_edit_white_shadow_24dp"
    app:showAsAction="always"
    android:title="Edit" />

<item
    android:id="@+id/action_delete"
    android:icon="@drawable/ic_delete_white_shadow_24dp"
    app:showAsAction="always"
    android:title="Delete" />

Теперь переопределите два метода в вашей деятельности и сделайте переменную поля mMenu как:

  private Menu mMenu;         //  field variable    


  @Override
  public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.sell_menu, menu);
    this.mMenu = menu;

    menu.findItem(R.id.action_delete).setVisible(false);
    return super.onCreateOptionsMenu(menu);
  }

 @Override
 public boolean onOptionsItemSelected(MenuItem item) {
    if (item.getItemId() == R.id.action_delete) {
       // do action
        return true;
    } else if (item.getItemId() == R.id.action_edit) {
      // do action
        return true;
    }

    return super.onOptionsItemSelected(item);
 }

сделайте два следующих метода в своей деятельности и вызовите их от фрагмента, чтобы скрыть и показать пункт меню. Эти методы таковы:

public void showDeleteImageOption(boolean status) {
    if (menu != null) {
        menu.findItem(R.id.action_delete).setVisible(status);
    }
}

public void showEditImageOption(boolean status) {
    if (menu != null) {
        menu.findItem(R.id.action_edit).setVisible(status);
    }
}

что решать с моей стороны,я думаю, что это объяснение поможет вам.


поздно на вечеринку, но ответы выше, похоже, не сработали для меня.

мой первый фрагмент вкладки (использует getChildFragmentManager () для внутренних вкладок) имеет меню для отображения значка поиска и использует android.поддержка.В7.штучка.SearchView для поиска во внутреннем фрагменте вкладки, но переход на другие вкладки (которые также имеют внутренние вкладки с помощью getChildFragmentManager()) не удалит значок поиска (как не требуется) и, следовательно, по-прежнему доступен без функции, возможно, как я использую ниже (т. е. внешние основные вкладки с каждой внутренней вкладкой)

getChildFragmentManager(); 

однако я использую приведенное ниже в моих фрагментах, содержащих / использующих getChildFragmentManager () для внутренних вкладок.

    //region onCreate
    @Override
    public void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setRetainInstance(true);

    //access setHasOptionsMenu()
    setHasOptionsMenu(true);

    }
    //endregion onCreate

а затем очистить пункт меню внутри onPrepareOptionsMenu для фрагментов (значок поиска и функции)

    @Override
    public void onPrepareOptionsMenu(Menu menu) {

    super.onPrepareOptionsMenu(menu);

    //clear the menu/hide the icon & disable the search access/function ...
    //this will clear the menu entirely, so rewrite/draw the menu items after if needed
    menu.clear();

    }

работает хорошо и переход обратно на вкладку / внутреннюю вкладку с функциями значка поиска re отображает значок поиска и функции.

надеюсь, что это помогает...


установив видимость всех элементов в меню, меню приложения или меню будет скрываться автоматически

пример

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