OptionsMenu из фрагментов в Viewpager, показывающих друг друга Кнопки

У меня есть три фрагмента в viewpager.

Два из этих фрагментов имеют собственную версию метода onCreateOptionsMenu:

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

    // Set up 1 action button
    inflater.inflate(R.menu.home_snapshot_add, menu);
}

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

    // Set up 2 action buttons
    inflater.inflate(R.menu.home_snapshot_send, menu);
}

В домашней деятельности есть базовый метод onCreateOptionsMenu:

    @Override
public boolean onCreateOptionsMenu(Menu menu) {
    return false;
}

В методе onCreate каждый фрагмент вызывает метод:

setHasOptionsMenu(true);

Каждый из пунктов меню имеет тег:

android:showAsAction="always"

Кажется, что, когда я открываю Activity, появляются все три кнопки. Однако, когда я прокручиваю их, те волшебные магии исчезают. Похоже, что действие вызывает меню "Параметры фрагмента" в разделе "Создание активности", а затем соответствующим образом изменяет меню, когда я прокручиваю влево и вправо. Я проверил меню, но не уверен, что случилось. Все, что вы считаете, мне нужно проверить? Я немного из идей.

Спасибо!

Ответ 1

В вашем ViewPager OnPageChangeListener и после установки адаптера в ViewPager выполните следующее:

@Override
public void onPageSelected(int position){
   invalidateFragmentMenus(position);
}


private void invalidateFragmentMenus(int position){
   for(int i = 0; i < mViewPagerFragentAdapter.getCount(); i++){
      mViewPagerAdapter.getItem(i).setHasOptionsMenu(i == position);
   }
   invalidateOptionsMenu(); //or respectively its support method.
}

После настройки адаптера фрагмента вы получите тот же метод со следующим аргументом:

invalidateFragmentMenus(mViewPager.getCurrentItem());

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

Ответ 2

Я использовал это, и он работал у меня:

//In your Fragment
@Override
public void onResume() {
    super.onResume();
    setHasOptionsMenu(isVisible());

}