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); } } } 
但是,我在切换过程中遇到了奇怪的行为。
- 显示了黑色的碎片。
- 切换。
- 查看传呼机,可以在所显示的紫色和蓝色碎片之间滑动。
- 切换。
- 显示了黑色的碎片。
- 切换。
- 没有显示,因为MyFragmentPagerAdapter的getItem没有被触发。
我想我的情况类似于FragmentPagerAdapter getItem没有被调用
 但是,我不想使用FragmentStatePagerAdapter ,因为在页面之间切换时可能会产生更多的开销。 
任何解决方法来克服这个问题?
我包括一个完整的可行的源代码来演示这个问题: https : //www.dropbox.com/s/jok9tz5ktvfcteo/viewpagerbug.zip
任何解决方法来克服这个问题?
 我已经下载了你的代码,问题就出现了,因为你没有正确处理这些Fragments 。 大多数情况下,您在基于ViewPager的Fragment使用嵌套的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()) 
希望它会帮助你:)