android - 在 FragmentStatePagerAdapter 中保存状态和恢复状态

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

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

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

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

有人可以帮我继续吗。

最佳答案

无需覆盖 FragmentStatePagerAdaptersaveState()restoreState() 方法。

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

话虽如此,只需重写 fragment 的 onSaveInstanceState() 方法并将您想要恢复的所有内容放入 Bundle outState

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

现在你可以争论了:

"But I have already tried to save the state of the fragment that way. It does not work for me!"

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

此外,将您的 FragmentStatePagerAdapter 放在 Activity 的 onCreate 方法中(而不是放在 onStart 中)。

关于android - 在 FragmentStatePagerAdapter 中保存状态和恢复状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16416170/

相关文章:

android - Android Studio中设置kotlin断点时如何防止变量被优化掉

android - 操作栏、工具栏、 Activity 继承

android - 在 android 4.4 中运行时应用程序崩溃(NoClassDefFoundError)

android - 与 ViewPager 同步工具栏高度

java - 如何用Tablayout清除Viewpager的缓存内存

android - 引用错误的主要原因是什么?

android - "Developer error: this application is misconfigured"Google 使用列入白名单的客户端 ID 在 firebase 上登录

Android NFC开发使用Fragment

android - 只有第一张 map 在 ViewPager 中显示有多个 SupportMapFragment

java - 如何使用彩色按钮作为用户选择从第二个 Activity 更改我的 MainActivity 的背景颜色?