android - 如何使用setRetainInstance(boolean)?

标签 android android-fragments android-viewpager fragmentpageradapter

假设我有一个 fragment A。它有一个指向其 ViewPager 的实例变量 mViewPager

Fragment AonCreate(Bundle) 中,我调用 setRetainInstance(true)

方向改变后:

  1. onCreateView(LayoutInflater, ViewGroup, Bundle) 被调用,并且一个新的 View 被展开。因此,我在新膨胀的 View 中有一个新的 ViewPager

  2. mViewPager 在方向更改时指向原始 ViewPager

我的问题是:如何将 (1) 中的新 ViewPager 与 (2) 中保留的 mViewPager 关联起来?

或者我应该只使用onSaveInstanceState(Bundle)

最佳答案

正如 @Selvin 的评论中提到的,您应该重新创建 UI 元素。

您应该了解的一些信息:

setRetainInstance(true) 只能用于非 UI fragment 。我个人的建议是不要首先考虑这个,除非你别无选择。

To properly handle a restart, it is important that your activity restores its previous state through the normal Activity lifecycle, in which Android calls onSaveInstanceState() before it destroys your activity so that you can save data about the application state. You can then restore the state during onCreate() or onRestoreInstanceState().

您关于使用 onSaveInstanceState(Bundle) 的说法是正确的,一般来说,您应该使用它来保存状态。请注意,这是您保存的状态,而不是 UI 或整个 Fragment。

例如,状态可以是对按钮被单击次数的计数。 检查下面的链接了解如何保存状态

http://developer.android.com/training/basics/activity-lifecycle/recreating.html#SaveState

此外,一些 UI 状态,例如在 EditText 中输入的文本已在系统 API 中处理。所以你只需要处理你自己维护的状态。

编辑:

如果您对此不熟悉,并且不知道需要保存什么以及不需要保存什么,只需先跳过它,然后在不使用 onSaveInstanceState 的情况下尝试方向更改。然后你很快就会发现这个过程中丢失了什么,而这就是你需要保持的状态。

关于android - 如何使用setRetainInstance(boolean)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32475126/

相关文章:

android - 对 Android 中的请求代码值有什么建议吗?

android - 在 C++ OpenCV 中查找倾斜角度并旋转图像

Android横向模式切断了我在顶部的按钮

java - Firebase crashlytics 无法读取崩溃报告

android - 设备 api 级别 < 11 的 DialogFragments

java - fragment 已添加到 Activity 但不显示

android - 当选项卡式 Activity 滑回第一个选项卡时应用程序崩溃

java - viewpager 将当前 View 置于顶部

android - 在 ViewPager 位置从 SQLite 表设置 EditText

android - 如何从 Gallery 迁移到 Horizo​​ntalScrollView & ViewPager?