71

I find Fragment#setRetainInstance(true) confusing. Here is the Javadoc, extracted from the Android Developer API:

public void setRetainInstance (boolean retain)

Control whether a fragment instance is retained across Activity re-creation (such as from a configuration change). This can only be used with fragments not in the back stack. If set, the fragment lifecycle will be slightly different when an activity is recreated:

  • onDestroy() will not be called (but onDetach() still will be, because the fragment is being detached from its current activity).
  • onCreate(Bundle) will not be called since the fragment is not being re-created.
  • onAttach(Activity) and onActivityCreated(Bundle) will still be called.

Question: How do you as a developer use this, and why does it make things easier?

4

4 回答 4

92

作为开发人员,您如何使用它

打电话setRetainInstance(true)。我通常在我使用它的onCreateView()或中执行此操作。onActivityCreated()

为什么它让事情变得更容易?

它往往比onRetainNonConfigurationInstance()处理跨配置更改的数据保留更简单(例如,将设备从纵向旋转到横向)。未保留的片段在配置更改时被销毁并重新创建;保留的片段不是。因此,那些保留的片段所持有的任何数据都可用于配置更改后的活动。

于 2012-06-22T16:38:50.443 回答
49

这对于保持长时间运行的资源(例如套接字)打开非常有帮助。拥有一个包含对蓝牙套接字的引用的无 UI 片段,当用户翻转手机时,您不必担心重新连接它们。

它还可以方便地保留对需要很长时间才能加载的资源的引用,例如位图或服务器数据。加载一次,将其保存在保留的片段中,当活动重新加载时,它仍然存在,您不必重建它。

于 2012-06-22T16:39:36.380 回答
34

很晚才添加这个答案,但我认为它会让事情变得更清楚。跟我说。什么时候setRetainInstance

错误的

  • 片段在配置更改时重新创建。新实例已创建。
  • 所有生命周期方法都会在配置更改时调用,包括onCreate()onDestroy()

真的

  • 配置更改时不会重新创建片段。使用相同的实例。
  • 所有生命周期方法都在配置更改、APART FROMonCreate()onDestroy().
  • 添加到后台堆栈时,保留实例将不起作用。

不要忘记,上面的内容适用于DialogFragments 和 Fragments。

于 2013-09-08T08:23:36.430 回答
5

不推荐使用 setRetainInstance(boolean) 方法,请改用 ViewModels。

Fragments 上的setRetainInstance(boolean)方法在 Fragment API的1.3.0版本中已被弃用。

随着ViewModels的引入,开发人员有一个特定的 API 用于保留可以与活动、片段和导航图相关联的状态。这允许开发人员使用正常的、未保留的 Fragment 并将他们想要保留的特定状态分开。

这确保了开发人员对这些 Fragment 有一个更易于理解的生命周期(匹配所有其余 Fragment 的生命周期),同时保持单次创建和单次销毁的有用属性(在这种情况下ViewModel,)onCleared()ViewModel

于 2020-03-12T06:05:06.217 回答