我指的是Why use Fragment#setRetainInstance(boolean)?是用碎片的setRetainInstance(真)真的是一个很好的做法来处理旋转变化
我之所以问那么是Activity
来处理旋转,Official Activity Documentation鼓励我们,让Activity
关机和轮换期间重新启动
android:configChanges列出活动 将自行处理的配置更改。当运行时发生配置更改时, 活动默认关闭并重新启动,但使用此属性声明 配置将会阻止重新启动活动 。相反,该活动仍在运行,并调用其onConfigurationChanged()方法。注意:应该避免使用此属性 ,并仅将其用作最后的手段。请阅读处理 运行时间更改以了解有关如何正确处理由于配置更改而导致的重新启动 的更多信息。
任何尝试更改此Activity默认行为似乎都是不好的做法。为避免重新启动时重新加载耗时的数据结构,我们使用onRetainNonConfigurationInstance
和getLastNonConfigurationInstance
。 - Official Handling Runtime Changes
但是,当涉及处理片段中的旋转时,Google会给我们不同的建议吗?他们不希望我们关闭并重新启动Fragment?
public Object onRetainNonConfigurationInstance()
此方法已被废弃在代替API级别13.使用新片段API setRetainInstance(布尔值);通过Android兼容性软件包,旧款 平台也可以使用此功能。
- 为什么谷歌鼓励我们关停和旋转过程中重新启动活动,但鼓励我们旋转过程中保持片段?
- 如果
setRetainInstance(true)
擅长处理轮换,Google为什么不将它作为Fragment的默认行为?
是的忘记了为什么它不聪明的使用视图,但上下文泄漏是答案。 – Warpzit 2013-02-25 12:03:11
**“只能与不包含任何将在循环中重新创建的引用的片段一起使用。”**我不太确定这是否100%准确。如果保留的片段在'onActivityCreated(Bundle)'中设置了对父Activity的引用(这将在每次配置更改后在保留的片段中调用),那么这应该不足以确保保留的'Fragment'从来没有提到一个旧的“活动”? – 2013-04-22 00:10:12
@AlexLockwood如果你看源代码,'FragmentManager'设置一个片段的'mActivity'字段为其在attach时的父活动,并且当该片段被分离时,也将其设置回null **。在可由'getActivity()'访问的片段中。因此,并不总是需要存储对父活动的另一个引用,并且如果这样做,则必须在分离时清除/释放它。诚然,如果你足够小心以确保你不会泄漏上下文引用,你可以以任何方式使用它。我的目的是阻止在任何Fragment上无意识地使用'setReatainInstance()'。 – 2013-04-22 04:52:00