Фрагменты с setHasOptionsMenu в ViewPager получают onCreateOptionsMenu, вызываемый несколько раз

Итак, у меня есть контейнер для фрагментов под названием «контейнер», который представляет собой FrameLayout.

В этот контейнер я помещаю фрагмент с ViewPager с именем CollectionsFragment.

CollectionsFragment имеет 3 фрагмента:

  • AllCollectionsFragment — setHasOptionsMenu (true)
  • MyCollectionsFragment - без меню
  • FavouriteCollectionsFragment - без меню

AllCollectionsFragment содержит список коллекций и меню счетчика на панели действий, и когда пользователь щелкает коллекцию, другой фрагмент с именем ViewCollectionFragment помещается в контейнер активности, поэтому:

AllCollectionsFragment -> onClick(position) -> ViewCollectionFragment (помещается в основной контейнер активности)

Проблема в том, что ViewCollectionFragment не имеет меню. Он имеет setHasOptionsMenu (false). Но Android по-прежнему вызывает AllCollectionsFragment onCreateOptionsMenu, даже когда отображается ViewCollectionFragment, а меню AllCollectionFragment все еще отображается, когда ViewCollectionFragment виден.

Я использую FragmentStatePagerAdapter и передаю адаптеру getChildFragmentManager() из CollectionsFragment.

У меня также есть onBackstackChangeListener для контейнера активности, который делает недействительным меню параметров всякий раз, когда задний стек изменяется так: CollectionsFragment -> AllCollectionsFragment (по умолчанию) -> Select collection -> Add ViewCollectionsFragment в backstack и в основном контейнере-> invalidateOptionsMenu -> AllCollectionsFragment.onCreateOptionsMenu по-прежнему вызывается и отображается меню

Любые идеи, почему или я должен дать больше объяснений?


person NMP    schedule 14.07.2015    source источник
comment
Дочерние элементы действий/фрагментов всегда будут комбинировать свое меню параметров с меню параметров своего родителя. Проверьте, есть ли в вашей MainActivity меню опций.   -  person McGuile    schedule 14.07.2015
comment
Да, у него есть меню опций. Я также хочу упомянуть, что у меня есть onBackStackChangeListener для основного контейнера, и всякий раз, когда backstack обновляется, запускается supportInvalidateOptionsMenu(). Это означает, что когда пользователь находится в AllCollectionsFragment -> Нажать на коллекцию -> Backstack изменить + сделать недействительным -> ViewCollectionsFragment -> AllCollectionsFragment.onCreateOptionsMenu -> Меню AllCollectionsFragment по-прежнему отображается в ViewCollectionsFragment. То есть вы имеете в виду, что это нормально из-за детско-родительских отношений?   -  person NMP    schedule 14.07.2015


Ответы (1)


Я сделал обходной путь для этой "проблемы". Я скрываю меню в своей основной деятельности (я проверяю, есть ли фрагмент по его тегу), и я проверяю фрагмент, если backstack > 0, и скрываю меню...

person NMP    schedule 17.07.2015