如何使用 setRetainInstance(boolean)?
How to use setRetainInstance(boolean)?
假设我有一个Fragment A
。它有一个实例变量 mViewPager
指向它的 ViewPager
.
在 Fragment A
的 onCreate(Bundle)
中,我调用 setRetainInstance(true)
.
方向改变时:
onCreateView(LayoutInflater, ViewGroup, Bundle)
被调用,一个新的视图被膨胀。所以,我在新膨胀的视图中有一个新的 ViewPager
。
mViewPager
在方向改变时指向原始 ViewPager
。
我的问题是:如何让 (1) 中的新 ViewPager
与 (2) 中保留的 mViewPager
相关联?
或者我应该只使用 onSaveInstanceState(Bundle)
?
如 @Selvin 的评论所述,您应该重新创建 UI 元素。
你应该知道的一些信息:
setRetainInstance(true)
应仅用于非 UI 片段。我个人的建议是不要先考虑这个,除非你 运行 别无选择。
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 或整个片段。
例如,状态可以是按钮被点击次数的计数。
查看下面的 link 如何保存状态
http://developer.android.com/training/basics/activity-lifecycle/recreating.html#SaveState
此外,一些 UI 状态,例如在 EditText 中输入的文本已在系统中处理 API。所以你只需要处理你自己维护的状态。
编辑:
如果您是新手,不知道需要保存什么不需要保存什么,请先跳过它,然后在不 onSaveInstanceState
的情况下尝试改变方向。然后你很快就会发现在这个过程中丢失了什么,那就是你需要保持的状态。
假设我有一个Fragment A
。它有一个实例变量 mViewPager
指向它的 ViewPager
.
在 Fragment A
的 onCreate(Bundle)
中,我调用 setRetainInstance(true)
.
方向改变时:
onCreateView(LayoutInflater, ViewGroup, Bundle)
被调用,一个新的视图被膨胀。所以,我在新膨胀的视图中有一个新的ViewPager
。mViewPager
在方向改变时指向原始ViewPager
。
我的问题是:如何让 (1) 中的新 ViewPager
与 (2) 中保留的 mViewPager
相关联?
或者我应该只使用 onSaveInstanceState(Bundle)
?
如 @Selvin 的评论所述,您应该重新创建 UI 元素。
你应该知道的一些信息:
setRetainInstance(true)
应仅用于非 UI 片段。我个人的建议是不要先考虑这个,除非你 运行 别无选择。
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 或整个片段。
例如,状态可以是按钮被点击次数的计数。 查看下面的 link 如何保存状态
http://developer.android.com/training/basics/activity-lifecycle/recreating.html#SaveState
此外,一些 UI 状态,例如在 EditText 中输入的文本已在系统中处理 API。所以你只需要处理你自己维护的状态。
编辑:
如果您是新手,不知道需要保存什么不需要保存什么,请先跳过它,然后在不 onSaveInstanceState
的情况下尝试改变方向。然后你很快就会发现在这个过程中丢失了什么,那就是你需要保持的状态。