为什么要使用Fragment #setRetainInstance(boolean)?

Håv*_*hus 64 android android-lifecycle android-fragments

我发现Fragment #setRetainInstance(true)令人困惑.这是从Android Developer API中提取的Javadoc :

public void setRetainInstance(boolean retain)

控制是否在活动重新创建(例如从配置更改)中保留片段实例.这只能用于不在后栈中的片段.如果设置,则在重新创建活动时,片段生命周期会略有不同:

  • onDestroy()不会被调用(但是onDetach()仍然会被调用,因为片段正在与其当前活动分离.
  • 因为片段没有被重新创建,所以不会调用onCreate(Bundle).
  • onAttach(活动)和onActivityCreated(捆绑)仍然被调用.

问题:作为开发人员,您如何使用它,为什么它会使事情变得更容易?

Com*_*are 83

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

打电话setRetainInstance(true).我通常在onCreateView()onActivityCreated()使用它的地方.

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

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

  • @Neil:查看片段是否存在(例如,`findFragmentById()`).如果存在,请不要重新创建它. (4认同)
  • @ e.shishkin:应该是.我很少在片段中实现`onCreate()`,所以我没有尝试过. (3认同)

Dee*_*eeV 47

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

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


Eur*_*nes 29

很晚才添加这个答案,但我认为这会让事情更加清晰.跟我说吧.当setRetainInstance是:

  • 片段在配置更改时重新创建.NEW INSTANCE已创建.
  • 在配置更改时调用所有生命周期方法,包括onCreate()和onDestroy().

真正

  • 片段不会在配置更改时重新创建.使用相同的实例.
  • 在配置更改,APART FROM onCreate()和onDestroy()上调用所有生命周期方法.
  • 添加到Backstack时,保留实例将不起作用.

不要忘记以上内容适用于DialogFragments以及Fragments.


Dar*_*ish 5

setRetainInstance(boolean) 方法已弃用,请使用 ViewModels 代替。

从fragment API 1.3.0版开始,Fragments 上的方法setRetainInstance(boolean)已被弃用

随着ViewModel的引入,开发人员可以使用特定的 API 来保留与“活动”、“片段”和“导航图”相关联的状态。这允许开发人员使用普通的、不保留的 Fragment 并将他们想要保留的特定状态分开。

这确保了开发人员对这些片段有一个更容易理解的生命周期(与所有其余片段相匹配的生命周期),同时保持单个创建和单个销毁的有用属性(在本例中,是 的构造函数和来自的ViewModel回调onCleared())这ViewModel)。