在FragmentStatePagerAdapter中保存和恢复状态

7
我正在使用 ViewPagerFragmentStatePageAdapter,我的屏幕上有5个页面,其中包含大量的图片和视图。目前我设置了 mViewPager.setOffscreenPageLimit(1);,因此只有当前页、前一页和后一页会被保留在内存中,而其他两页将被销毁。但是对于那些被销毁的片段,我想利用适配器的 saveState()restoreState() 来维护其状态,这样当我回到该屏幕时,它将自动进入该片段的 onCreateView(),从而维护状态。
设置 mViewPager.setOffscreenPageLimit(4); 不是一个好的选择,因为它会导致内存问题。
我搜索了很多,但我没有找到任何使用这两个函数来维护和恢复状态的示例。
有人可以帮助我吗?
2个回答

3
没有必要覆盖FragmentStatePagerAdaptersaveState()restoreState()方法,主要是因为这已经是FragmentStatePagerAdapter实现的核心部分,已经为您完成了。您传递给构造函数的FragmentManager会负责恢复先前实例化的片段。实际上,FragmentStatePagerAdapterinstantiateItem()回调确保返回具有其保存状态的片段。
因此,只需重写您的片段的onSaveInstanceState()方法,并将您想要恢复的所有内容放入Bundle outState中即可。
您放置在Bundle中的数据将在传递给onCreate(Bundle)onCreateView(LayoutInflater, ViewGroup, Bundle)onActivityCreated(Bundle)方法的Bundle中可用。
如果您发现自己处于这种情况,请检查如何初始化片段的状态变量。可能是您从Bundle中获得了所需的值,但然后从片段的getArguments()方法获得的值覆盖了它。(这正是我的困境,也可能是您的情况,如果您使用工厂方法来实例化片段)。
此外,将您的FragmentStatePagerAdapter放在活动的onCreate方法中(而不是onStart中)。

2

FragmentStatePageAdapter 负责管理其状态,详情请参见:FragmentStatePagerAdapter.java

最好的做法是在 onDestroyView 回调中移除图像(例如,从适配器中移除),然后在 onCreatView 中重新加载它们。Fragments 和 adapters 会相应地恢复它们的状态。

唯一需要注意的是不要每次在 onStart 中创建 FragmentStatePagerAdapter,因为它将无法感知保存的状态。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接