在FragmentStatePagerAdapter中保存状态和还原状态

时间:2013-05-07 09:56:11

标签: android android-fragments android-viewpager android-adapter android-pageradapter

我在屏幕上使用ViewPagerFragmentStatePageAdapter我有5页有很多图片和视图。目前我有mViewPager.setOffscreenPageLimit(1);所以只有当前,前一个和下一个将在内存中,其他2将被销毁。但是对于那些被破坏的片段,我想利用适配器的saveState()restoreState()来维持它的状态,所以当我回到那个屏幕时,无论如何都会转到该片段的onCreateView()什么将维持国家。

拥有mViewPager.setOffscreenPageLimit(4);不是一个好选择,因为它有内存问题。

我搜索了很多,但我没有得到任何使用这两个函数维护和恢复状态的样本。

有人可以帮助我继续。

2 个答案:

答案 0 :(得分:2)

FragmentStatePageAdapter负责处理状态,请参阅:FragmentStatePagerAdapter.java

最好的方法是在onDestroyView回调中删除图像(例如来自适配器)并在onCreatView中重新加载它们。片段和适配器将相应地恢复其状态。

唯一的问题是,您不应每次都在FragmentStatePagerAdapter创建onStart,因为它不会知道已保存的状态。

答案 1 :(得分:2)

无需覆盖saveState()的{​​{1}}和restoreState()方法。

主要是因为它已经为您完成了FragmentStatePagerAdapter实施的核心。传递给构造函数的FragmentStatePagerAdapter负责恢复先前实例化的片段。实际上,FragmentManager的{​​{1}}回调确保它返回已保存状态的片段。

话虽如此,只需覆盖您片段的instantiateItem()方法,并将要恢复的所有内容放入FragmentStatePagerAdapter

您在Bundle中放置的数据将在onSaveInstanceState()Bundle outStateonCreate(Bundle)方法的套装中提供。

到现在为止你可以争辩说:

  

"但我已经尝试以这种方式保存片段的状态。   它对我不起作用!"

如果您发现自己处于这种情况,请检查如何初始化片段的状态变量。可能是你从Bundle中获得了你想要的东西,但是从你从片段的onCreateView(LayoutInflater, ViewGroup, Bundle)方法获得的值覆盖它。 (这正是我的斗争,也可能是你的情况,如果你使用工厂方法来实例化片段)。

另外,将onActivityCreated(Bundle)放在活动的getArguments()方法中(而不是FragmentStatePagerAdapter)。