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

16

我在一个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时,所有三个按钮都会出现。但是,当我滑动它们时,错误的按钮会神奇地消失。感觉这个Activity在创建时调用了每个Fragment的选项菜单,然后在左右滑动时适当更改了菜单。我已经检查了菜单,但不确定问题出在哪里。你认为我需要检查什么?我的想法有点不足。谢谢!
2个回答

20

在您的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.
}

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

invalidateFragmentMenus(mViewPager.getCurrentItem());

当调用invalidateOptionsMenu()方法时,上述语句将防止所有其他片段接收onCreateOptionsMenu()方法的调用,仅当前可见的片段将接收并能够填充选项菜单。


1
谢谢您的超快速响应! 我的代码有很多问题。
  1. 我已经为所有片段设置了setHasOptionsMenu为true。(您的代码解决了这个问题)
  2. 我有一个嵌套的片段,没有被您的代码捕获到。
  3. 活动自己的OptionsMenu正在尝试初始化菜单时填充自己的菜单。(已删除)
再次感谢!
- SalicBlu3
您可以使用 getChildFragmentManager() 迭代子片段并应用相同的逻辑,然后调用 invalidateOptionsMenu() - Nikola Despotoski
5
仅当您在页面适配器中保留片段引用列表时才能正常工作。这是我个人不喜欢的模式,因为Android必须替我完成这项工作,而分页器的整个目的是在滑动页面时释放内存...因此,我的adapter.getItem函数只返回新的fragments。 - Mostrapotski
我遇到了同样的问题,通过在片段的onCreate中设置setHasOptionMenu(true)并实现它的onCreateOptionMenu来解决。https://dev59.com/M10a5IYBdhLWcg3wRGvp#43730933 - Zar E Ahmer

1
我用过这个并且它对我有效:

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

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接