12

У меня есть три фрагмента в viewpager.OptionsMenu of Fragments in 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" 

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

Спасибо!

ответ

13

В вашем 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(), только получаемый в данный момент фрагмент получит и сможет популяризировать съели меню опций.

+1

Спасибо за вас супер быстрый ответ! В моем коде было много чего не так. 1. У меня был setHasOptionsMenu для истины для всех моих фрагментов. (ваш код исправлен) 2. У меня был вложенный фрагмент, который не был пойман вашим кодом 3. Собственные параметры ActivityMenu активности раздували свое собственное меню в качестве попытки инициализировать меню. (было удалено) Еще раз спасибо! – SalicBlu3

+0

Вы можете перебирать дочерние фрагменты с помощью 'getChildFragmentManager()' и применять такую ​​же логику, а затем вызывать 'invalidateOptionsMenu()' –

+4

Работает только в том случае, если в вашем пейджер-адаптере вы сохраняете список ссылок на фрагменты. Это шаблон, который мне лично не нравится, так как андроид должен сделать это для меня, и вся цель пейджера - освободить память при слайд-страницах ... Так что моя функция adapter.getItem возвращает только новые фрагменты. – Mostrapotski

0

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

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

} 
+0

Это не сработало – krisDrOid