我的应用程序中有标签.每个标签都有不同的片段,并有不同的菜单.下面是我正在使用的布局
现在,onCreate()
我已经提到了每一个片段setHasOptionsMenu(true);
.我已经覆盖了onCreateOptionsMenu()
每个片段中的函数,它menu.clear();
首先调用它的超级构造函数然后膨胀片段自己的菜单xml.但我得到的结果是这样的 -
假设有5个选项卡.第二个和第三个选项卡中的viewpager每个包含两个以内的片段
第一个标签没有菜单
第二个选项卡有menu_2(仅适用于第二个子片段)
第三个标签再次没有菜单
第4个选项卡有menu_4(仅适用于第1个子片段)
第五个标签有menu_5
最初,选项卡1应该没有菜单,这是好的.然后直接移动到第三个选项卡,它显示menu_4,默认情况下不显示菜单.然后滑动到选项卡4,它将显示正确的menu_4然后滑回第3个选项卡,它将显示没有菜单(这是必需的).
对于选项卡5也会发生同样的情况.如果我在第二个选项卡中切换到第二个子片段,则第一个选项卡会出现相同的行为.
简而言之,根据我的观察,它显示了相邻标签的菜单,它实际上是在当前片段之后执行的,因此正在发生这种行为.
那么如何避免这种情况呢?
我写了一个小测试应用程序来检查行为.
让我们看看样本,看看你的片段是否有问题(如上所示,ViewPager与不同的菜单就像魅力一样)
Activity
的XML:
Activity
类.重要的是invalidateOptionsMenu()
每次ViewPager
都有PageSelected事件.然后,我们设置setHasOptionsMenu
所有片段和子片段(从嵌套ViewPager
s)到false
屏幕外.
public class MainActivity extends AppCompatActivity { PagerAdapter pagerAdapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Fragment[] fragments = { Fragment.instantiate(this, FragmentNoMenu.class.getName()), Fragment.instantiate(this, FragmentA.class.getName()), Fragment.instantiate(this, FragmentNoMenu.class.getName()), Fragment.instantiate(this, FragmentB.class.getName()), }; TabLayout tabLayout = (TabLayout)findViewById(R.id.tabLayout); ViewPager viewPager = (ViewPager)findViewById(R.id.viewPager); pagerAdapter = new PagerAdapter(getSupportFragmentManager(), fragments); viewPager.setAdapter(pagerAdapter); viewPager.setOffscreenPageLimit(0); viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {} @Override public void onPageSelected(int position) { invalidateOptionsMenu(position); } @Override public void onPageScrollStateChanged(int state) {} }); invalidateOptionsMenu(0); tabLayout.setupWithViewPager(viewPager); } private void invalidateOptionsMenu(int position) { for(int i = 0; i < pagerAdapter.getCount(); i++) { Fragment fragment = pagerAdapter.getItem(i); fragment.setHasOptionsMenu(i == position); if (fragment instanceof FragmentWithViewPager) { FragmentWithViewPager fragmentWithViewPager = (FragmentWithViewPager)fragment; if (fragmentWithViewPager.pagerAdapter != null) { for (int j = 0; j < fragmentWithViewPager.pagerAdapter.getCount(); j++) { fragmentWithViewPager.pagerAdapter.getItem(j).setHasOptionsMenu(i == position); } } } } invalidateOptionsMenu(); } }
PagerAdapter
类:
public class PagerAdapter extends FragmentPagerAdapter { private final Fragment[] fragments; public PagerAdapter(FragmentManager fragmentManager, Fragment[] fragments) { super(fragmentManager); this.fragments = fragments; } @Override public CharSequence getPageTitle(int position) { return fragments[position].getClass().getSimpleName(); } @Override public Fragment getItem(int position) { return fragments[position]; } @Override public int getCount() { return fragments.length; } }
这是我使用的测试片段:
FragmentNoMenu
类:
public class FragmentNoMenu extends android.support.v4.app.Fragment { @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { return inflater.inflate(R.layout.fragment_no_menu, container, false); } }
FragmentNoMenu
布局:
FragmentA
class是具有嵌套ViewPager的片段:
public class FragmentA extends FragmentWithViewPager { @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.fragment_a, container, false); Fragment[] fragments = { Fragment.instantiate(getContext(), SubFragmentA.class.getName()), Fragment.instantiate(getContext(), SubFragmentB.class.getName()), Fragment.instantiate(getContext(), SubFragmentC.class.getName()), }; if (pagerAdapter == null) { pagerAdapter = new PagerAdapter(getChildFragmentManager(), fragments); } viewPager = (ViewPager)rootView.findViewById(R.id.viewPager); viewPager.setAdapter(pagerAdapter); return rootView; } @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { inflater.inflate(R.menu.fragment_a, menu); super.onCreateOptionsMenu(menu, inflater); } }
FragmentA
的布局:
FragmentA
的菜单:
NB!FragmentA
extends FragmentWithViewPager
- 它是一个小扩展,Fragment
可以更容易地将片段与MainActivity中的嵌套片段区分开来:
public class FragmentWithViewPager extends Fragment { PagerAdapter pagerAdapter; ViewPager viewPager; }
FragmentB
:
public class FragmentB extends Fragment { @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { return inflater.inflate(R.layout.fragment_b, container, false); } @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { inflater.inflate(R.menu.fragment_b, menu); super.onCreateOptionsMenu(menu, inflater); } }
它的布局和菜单:
.....
子片段(从代码角度看它们看起来都一样):
布局:
码:
public class SubFragmentB extends Fragment { @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { return inflater.inflate(R.layout.subfragment_b, container, false); } }
而已!我已将项目上传到我的Dropbox - 随时查看!
我希望,这有帮助