FragmentPagerAdapter getItem没有被触发

目前,使用FragmentActivity ,我使用以下代码在2种片段之间切换。

 private void toggle() { Fragment oldFragment = getSupportFragmentManager().findFragmentById(R.id.content); Fragment fragment = null; if (oldFragment instanceof ColorFragment) { fragment = new ViewPagerFragment(); } else { fragment = new ColorFragment(android.R.color.black); } getSupportFragmentManager().beginTransaction().replace(R.id.content, fragment).commitAllowingStateLoss(); } 

2片段正在切换。

  • ColorFragment – 用纯黑色填充背景的简单片段。
  • ViewPagerFragment – 片段包含ViewPager 。 用户可以在紫色的颜色片段和蓝色的颜色片段之间滑动。

负责划动紫色和蓝色碎片的代码如下。

 private static class MyFragmentPagerAdapter extends FragmentPagerAdapter { public MyFragmentPagerAdapter(FragmentManager fm) { super(fm); } @Override public int getCount() { return 2; } @Override public Fragment getItem(int position) { switch (position) { case 0: return new ColorFragment(android.R.color.holo_purple); default: return new ColorFragment(android.R.color.holo_blue_bright); } } } 

但是,我在切换过程中遇到了奇怪的行为。

  1. 显示了黑色的碎片。
  2. 切换。
  3. 查看传呼机,可以在所显示的紫色和蓝色碎片之间滑动。
  4. 切换。
  5. 显示了黑色的碎片。
  6. 切换。
  7. 没有显示,因为MyFragmentPagerAdapter的getItem没有被触发。

我想我的情况类似于FragmentPagerAdapter getItem没有被调用

但是,我不想使用FragmentStatePagerAdapter ,因为在页面之间切换时可能会产生更多的开销。

任何解决方法来克服这个问题?

我包括一个完整的可行的源代码来演示这个问题: https : //www.dropbox.com/s/jok9tz5ktvfcteo/viewpagerbug.zip

任何解决方法来克服这个问题?

我已经下载了你的代码,问题就出现了,因为你没有正确处理这些Fragments 。 大多数情况下,您在基于ViewPagerFragment使用嵌套的Fragments ,并为该ViewPager创build适配器,如下所示:

 MyFragmentPagerAdapter myFragmentPagerAdapter = new MyFragmentPagerAdapter(this.getFragmentManager()); 

相反,你应该使用getChildFragmentManager()来绑定嵌套的片段:

 MyFragmentPagerAdapter myFragmentPagerAdapter = new MyFragmentPagerAdapter(this.getChildFragmentManager()); 

另外,你不应该通过构造函数将数据传递给Fragment因为这些数据不会在configuration更改中生存下来,不好的事情会开始出现。 改用Bundle

全球工作testing解决scheme

getSupportFragmentManager()保留空引用的次数,View pager不会创build新的fragment实例,因为它find了对同一个fragment的引用。 所以为了解决这个问题,使用getChildFragmentManager()以简单的方式解决问题。

new PagerAdapter(getSupportFragmentManager(), fragments);

new PagerAdapter(getChildFragmentManager() , fragments);

在我的情况下,我正确地打电话

 MyFragmentPagerAdapter myFragmentPagerAdapter = new MyFragmentPagerAdapter(this.getChildFragmentManager()); 

但后来在嵌套的片段,我试图用另一个replace容器片段使用:

 getFragmentManager() 

你需要去活动和打电话

 getActivity().getSupportFragmentManager(); 

在我的情况下,它添加到我的FragmentPagerAdapter后

  @Override public int getItemPosition(Object object) { return POSITION_NONE; } 

而且我也使用了getChildFragmentManager(),就像Luksprog所说的那样

简单的使用FragmentStatePagerAdapter而不是FragmentPagerAdapter

要么

你可以使用new MyFragmentPagerAdapter(this.getChildFragmentManager())

希望它会帮助你:)