Дублирование меню и данных во фрагментах после использования FragmentStatePagerAdapter

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

Проблема. У меня есть панель навигации, в которой есть 6 фрагментов, но одно действие. Все работало нормально, пока я не изменил фрагмент 1-го ранга в ящике. Мне нужны вкладки Swipe внутри первого фрагмента. Поэтому я использовал FragmentStatePagerAdapter.

  • Каждый фрагмент имеет свое меню вместе с MainActivity Menu.

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    
        // Notify the system to allow an options menu for this fragment.
        setHasOptionsMenu(true);
    }
    

    И надувается вот так:

    @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        inflater.inflate(R.menu.story, menu);
    }
    
  • Все работает нормально. Но когда я посещаю другие фрагменты в навигационном ящике, он показывает дублирующее меню на панели инструментов. Он создает больше дубликатов, если на панели инструментов остается место, когда я посещаю другие фрагменты.

Попробуйте 1. Чтобы решить эту проблему, я сначала использовал:

@Override
public void onPrepareOptionsMenu(Menu menu) {
    menu.clear();
}

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

При этом я не получаю повторяющееся меню, но теперь я не вижу MainActivity menus.

Попробуйте 2:

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    getActivity().invalidateOptionsMenu();
    inflater.inflate(R.menu.story, menu);
}

При этом я получаю меню «Фрагмент» и «Активность», но есть дубликаты.

Это должно быть легко решить, но я не понимаю, как с этим справиться. Может я плохо понял жизненный цикл?

Мой другой подход. Реализация всех меню во фрагментах поможет, но это должен быть наш последний вариант.

Решение этого. Чтобы поддерживать оба меню, все, что мне нужно сделать, это это (очень простое решение):

menu.clear();
inflater.inflate(R.menu.story, menu);
getActivity().getMenuInflater().inflate(R.menu.main, menu);

Проблема 2 Метод OnOptionsItemSelected из 1-го фрагмента вызывается в других фрагментах.


person Roon13    schedule 18.12.2015    source источник
comment
так что в основном вам нужны общие пункты меню для всех фрагментов, поступающих из вашего файла activity_menu, и остальные из фрагментов, верно?   -  person PunitD    schedule 18.12.2015
comment
В других фрагментах, если вам не нужно меню, вызовите для них setHasOptionsMenu(false);.   -  person Piyush    schedule 18.12.2015
comment
@PiyushGupta Я хочу меню из каждого фрагмента.   -  person Roon13    schedule 18.12.2015
comment
@Roon13 Roon13, тогда ваш последний вариант - лучший вариант ... реализация пунктов меню [связанных с фрагментами] + общий для всех фрагментов ..   -  person PunitD    schedule 18.12.2015
comment
@ Roon13 Roon13, я снова прочитал ваш вопрос ... Итак, ваш фрагмент должен правильно отображать пункты меню до изменения вашего первого фрагмента для реализации FragmentPagerAdapter, верно?   -  person PunitD    schedule 18.12.2015
comment
Да изначально работал нормально. Я использовал FragmentPagerAdapter внутри 1-го фрагмента для прокрутки. После этого эта проблема запускается.   -  person Roon13    schedule 18.12.2015


Ответы (1)


  private void hideAllMenuItems() {
        if (actionBarMenu != null) {
            actionBarMenu.findItem(R.id.action_item1).setVisible(false);
            actionBarMenu.findItem(R.id.action_item2).setVisible(false);
        }
    }


    private void showMenuIcon() {
        if (actionBarMenu != null) {
            hideAllMenuItems();
            if (currentFragment instanceof Fragment1)
                actionBarMenu.findItem(R.id.action_item1).setVisible(true);

            else if (currentFragment instanceof Fragment2)
                actionBarMenu.findItem(R.id.action_item2).setVisible(true);

        }
    }

вызывайте ShoeMenuIcon() каждый раз при загрузке нового фрагмента..

Надеюсь, ты ищешь это

person mhl1291    schedule 18.12.2015