假设我有一个 fragment A
。它有一个指向其 ViewPager
的实例变量 mViewPager
。
在 Fragment A
的 onCreate(Bundle)
中,我调用 setRetainInstance(true)
。
方向改变后:
onCreateView(LayoutInflater, ViewGroup, Bundle)
被调用,并且一个新的 View 被展开。因此,我在新膨胀的 View 中有一个新的ViewPager
。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/