Viewpager中的Fragments的OptionsMenu显示彼此的按钮

Sal*_*lu3 15 android android-fragments android-optionsmenu android-actionbar

我在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);
}
Run Code Online (Sandbox Code Playgroud)

home活​​动有一个基本的onCreateOptionsMenu方法:

    @Override
public boolean onCreateOptionsMenu(Menu menu) {
    return false;
}
Run Code Online (Sandbox Code Playgroud)

在onCreate方法中,每个片段都调用该方法:

setHasOptionsMenu(true);
Run Code Online (Sandbox Code Playgroud)

每个菜单项都有标签:

android:showAsAction="always"
Run Code Online (Sandbox Code Playgroud)

好像我打开Activity一样,所有三个按钮都出现了.然而,当我滚动它们时,错误的那些神奇地消失了.感觉就像活动在Activity创建时调用每个Fragment的选项菜单,然后在我向左和向右滑动时适当地更改菜单.我检查了菜单,但不确定是什么问题.您认为我需要检查的任何事情?我有点想法了.

谢谢!

Nik*_*ski 17

在您ViewPagerOnPageChangeListener设置和将适配器设置为之后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.
}
Run Code Online (Sandbox Code Playgroud)

设置片段适配器后,使用以下参数调用相同的方法:

invalidateFragmentMenus(mViewPager.getCurrentItem());
Run Code Online (Sandbox Code Playgroud)

以上语句将阻止所有其他片段在调用onCreateOptionsMenu()时不接收方法invalidateOptionsMenu()调用,只有当前可见的片段将接收并能够填充选项菜单.

  • 只有在您的寻呼机适配器中保留了片段引用列表时才有效.这是我个人不喜欢的模式,因为android必须为我做,并且当我们滑动页面时,寻呼机的整个目的是释放内存...所以我的adapter.getItem函数只返回新的片段. (5认同)