7

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

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

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

有人可以帮我继续。

4

2 回答 2

3

无需覆盖. saveState()_restoreState()FragmentStatePagerAdapter

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

话虽如此,只需覆盖onSaveInstanceState()片段的方法并将要恢复的所有内容放入Bundle outState.

您放置在 Bundle 中的数据将在提供给 、 和 方法的 BundleonCreate(Bundle)onCreateView(LayoutInflater, ViewGroup, Bundle)可用onActivityCreated(Bundle)

现在你可以争论:

“但我已经尝试过用那种方式保存碎片的状态。它对我不起作用!”

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

另外,将您FragmentStatePagerAdapteronCreate方法放入活动的方法中(而不是放入onStart)。

于 2017-06-20T08:48:01.467 回答
2

FragmentStatePageAdapter照顾它的状态见:FragmentStatePagerAdapter.java

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

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

于 2013-12-11T15:43:11.947 回答