我在屏幕上使用ViewPager
和FragmentStatePageAdapter
我有5页有很多图片和视图。目前我有mViewPager.setOffscreenPageLimit(1);
所以只有当前,前一个和下一个将在内存中,其他2将被销毁。但是对于那些被破坏的片段,我想利用适配器的saveState()
和restoreState()
来维持它的状态,所以当我回到那个屏幕时,无论如何都会转到该片段的onCreateView()
什么将维持国家。
拥有mViewPager.setOffscreenPageLimit(4);
不是一个好选择,因为它有内存问题。
我搜索了很多,但我没有得到任何使用这两个函数维护和恢复状态的样本。
有人可以帮助我继续。
答案 0 :(得分:2)
FragmentStatePageAdapter
负责处理状态,请参阅:FragmentStatePagerAdapter.java
最好的方法是在onDestroyView
回调中删除图像(例如来自适配器)并在onCreatView
中重新加载它们。片段和适配器将相应地恢复其状态。
唯一的问题是,您不应每次都在FragmentStatePagerAdapter
创建onStart
,因为它不会知道已保存的状态。
答案 1 :(得分:2)
saveState()
的{{1}}和restoreState()
方法。主要是因为它已经为您完成了FragmentStatePagerAdapter
实施的核心。传递给构造函数的FragmentStatePagerAdapter
负责恢复先前实例化的片段。实际上,FragmentManager
的{{1}}回调确保它返回已保存状态的片段。
话虽如此,只需覆盖您片段的instantiateItem()
方法,并将要恢复的所有内容放入FragmentStatePagerAdapter
。
您在Bundle中放置的数据将在onSaveInstanceState()
,Bundle outState
和onCreate(Bundle)
方法的套装中提供。
到现在为止你可以争辩说:
"但我已经尝试以这种方式保存片段的状态。 它对我不起作用!"
如果您发现自己处于这种情况,请检查如何初始化片段的状态变量。可能是你从Bundle中获得了你想要的东西,但是从你从片段的onCreateView(LayoutInflater, ViewGroup, Bundle)
方法获得的值覆盖它。 (这正是我的斗争,也可能是你的情况,如果你使用工厂方法来实例化片段)。
另外,将onActivityCreated(Bundle)
放在活动的getArguments()
方法中(而不是FragmentStatePagerAdapter
)。