使用Fragment的setRetainInstance(true)确实是处理旋转变化的好方法

时间:2013-02-25 11:36:29

标签: android

我指的是Why use Fragment#setRetainInstance(boolean)?

我之所以要求Activity处理轮换,Official Activity Documentation鼓励我们让Activity在轮换期间关闭并重启。

  

android:configChanges列出活动的配置更改   将处理自己。当运行时发生配置更改时,   默认情况下,活动已关闭并重新启动,但声明了一个   具有此属性的配置将阻止活动   重新启动。相反,活动仍然在运行   调用onConfigurationChanged()方法。注意:使用此属性   应避免使用,仅作为最后手段使用。请阅读处理   运行时更改有关如何正确处理的更多信息   由于配置更改而重新启动。

任何尝试更改此活动默认行为似乎都是不好的做法。为避免Activity在重新启动期间重新加载耗时的数据结构,我们会使用onRetainNonConfigurationInstancegetLastNonConfigurationInstance。 - Official Handling Runtime Changes

然而,当在Fragment中处理轮换时,谷歌会给我们不同的推荐吗?他们不希望我们关闭并重新启动Fragment?

public Object onRetainNonConfigurationInstance ()

  

此方法在API级别13中已弃用。请使用新的Fragment API   改为setRetainInstance(boolean);这也适用于老年人   平台通过Android兼容包。

  1. 为什么Google会鼓励我们在轮播期间关闭并重新启动Activity,但是鼓励我们在轮换期间保留片段?
  2. 如果setRetainInstance(true)善于处理轮换,为什么Google不将其作为Fragment的默认行为?

2 个答案:

答案 0 :(得分:32)

  • 配置更改:当突然屏幕变得更宽,高度更低(典型景观)时,可视组件更新其显示更加智能地使用可用屏幕。配置更改的另一个示例是用户滑动硬件键盘,设备语言更改等。为什么重新开始:

    • Android组件支持声明性布局,您可以加载一堆XML布局,并从那里开始工作。查找每个视图并实时重新安排/更新它将是一团糟,更不用说重新连接所有事件处理程序和其他自定义View代码。它更容易重新加载另一堆布局文件。

    • 此外,在Android中,活动类似于系统的生活,所以自然地,活动生命周期被设计(并推荐),它能够随时随地重新创建自己,只是就像它被摧毁之前一样。此模式适用于所有重新启动,也适用于配置更改。如果您使您的活动和碎片能够保持永恒状态,配置更改将不会是一个大问题。

    • 保留状态数据(模型),而不是显示它的内容(UI和视图)。

  • setRetainInstance(true):建议仅与不包含任何引用的片段一起使用,这些片段将在轮播时重新创建。这意味着你不应该在任何包含Context,Views等的Fragment上使用它。典型的Visual片段可以。但是对于包含运行Threads,AsyncTasks,Data Collections,加载资源,获取结果等对象的Fragments来说非常有用。这种方法有助于为Activity的非Context依赖对象使用非可视Fragment作为可拆卸的holder。

答案 1 :(得分:4)

因为你误解了它的用法。 setRetainInstance(true)只应用于与独奏元素/模块类似的片段中。处理套接字等的片段没有GUI真正受益于保留。具有GUI的片段可能不应使用setRetainInstance(true)。此外,任何进入Backstack的片段都不应使用setRetainIstance(true)

您可以将其概括为任何仅处理数据/连接等的片段,并使用setRetainInstance(true)。但是有许多不同的方法可以使用片段,这些方法不会使setRetainInstance(true)受益。