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())
希望它会帮助你:)