目前,使用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片段正在切换。
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);
}
}
}
然而,我在切换期间遇到了奇怪的行为。
我认为我的情况类似于FragmentPagerAdapter getItem is not called
但是,我不想使用FragmentStatePagerAdapter
,因为在页面之间切换时可能会产生更多开销。
解决此问题的任何解决方法?
我提供了一个完整可行的源代码来演示此问题:https://www.dropbox.com/s/jok9tz5ktvfcteo/viewpagerbug.zip
答案 0 :(得分:108)
解决此问题的任何解决方法?
我已下载您的代码并出现问题,因为您没有正确处理这些Fragments
。最精确的是,您在基于Fragments
ViewPager
的{{1}}中使用嵌套Fragment
,并为ViewPager
创建适配器,如下所示:
MyFragmentPagerAdapter myFragmentPagerAdapter = new MyFragmentPagerAdapter(this.getFragmentManager());
相反,您应该使用getChildFragmentManager()
绑定嵌套片段:
MyFragmentPagerAdapter myFragmentPagerAdapter = new MyFragmentPagerAdapter(this.getChildFragmentManager());
此外,您不应该通过构造函数将数据传递给Fragment
,因为数据将无法在配置更改后继续存在,并且会出现不良内容。请改用Bundle
。
答案 1 :(得分:12)
全球工作测试解决方案。
getSupportFragmentManager()
保留空引用一些次,而View寻呼机不会创建新的片段实例。因为它找到对同一片段的引用。所以过度使用getChildFragmentManager()
以简单的方式解决问题。
不要
<强> new PagerAdapter(getSupportFragmentManager(), fragments);
强>
<强>不要强>
<强> new PagerAdapter(getChildFragmentManager() , fragments);
强>
答案 2 :(得分:1)
在我的情况下,我正确地打电话
MyFragmentPagerAdapter myFragmentPagerAdapter = new MyFragmentPagerAdapter(this.getChildFragmentManager());
但是在嵌套片段中,我试图用另一个替换容器片段:
getFragmentManager()
您需要转到活动并致电
getActivity().getSupportFragmentManager();
答案 3 :(得分:0)
在我的情况下,将其添加到我的 FragmentPagerAdapter 后,它有效:
@Override
public int getItemPosition(Object object) {
return POSITION_NONE;
}
我还使用 getChildFragmentManager(),就像Luksprog所说
答案 4 :(得分:0)
简单使用FragmentStatePagerAdapter
代替FragmentPagerAdapter
或
您可以使用new MyFragmentPagerAdapter(this.getChildFragmentManager())
希望它会对你有所帮助:)。