Подтвердить что ты не робот

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

У меня есть Фрагмент Шерлока, в котором есть 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);
}

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

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

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

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

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

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

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

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

Ответ 3

Чтобы показать элементы действия (кнопки действий) в 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);
}

Не лучший вариант, но он работает, и это просто.

Ответ 4

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

// 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

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

Ответ 6

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

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

Ответ 7

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

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

Ответ 8

Даже если вопрос старый и ответил. Ответ на этот вопрос проще, чем выше. Вам не нужно использовать какие-либо другие переменные. Вы можете создавать кнопки на панели действий независимо от того, какой фрагмент вы хотите, вместо того, чтобы делать видимость (show/hide).

Добавьте в фрагмент следующее: нужный элемент меню.

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

Пример файла menu.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 выполняется как обычно.

Ответ 9

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

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