【发布时间】:2013-03-23 14:51:28
【问题描述】:
目前,使用FragmentActivity,我使用以下代码在两种类型的片段之间切换。
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 is not called
但是,我不喜欢使用FragmentStatePagerAdapter,因为在页面之间切换时可能会产生更多开销。
有什么办法可以解决这个问题吗?
我提供了一个完整的可用源代码来演示这个问题:https://www.dropbox.com/s/jok9tz5ktvfcteo/viewpagerbug.zip
【问题讨论】:
-
我不喜欢使用 FragmentStatePagerAdapter - 好吧,您至少尝试过它是否有什么不同? 因为在页面之间切换时可能会产生更多开销。 - 什么潜在开销?您发布的带有两个片段的场景非常简单。
-
@Luksprog 紫色和蓝色的 2 个片段用于演示目的。真实案例片段比这更复杂。我知道我可以通过捆绑保存信息或保留实例片段技术来减少一定程度的开销。但是,我意识到为我的情况避免开销的最佳方法是避免使用 FragmentStatePagerAdapter。
标签: android android-fragments android-viewpager fragmentpageradapter