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

时间:2012-06-22 16:32:36

标签: android android-fragments android-lifecycle

我发现Fragment #setRetainInstance(true)令人困惑。这是从Android Developer API

中提取的Javadoc
  

public void setRetainInstance (boolean retain)

     

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

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

问题:作为开发人员,您如何使用此功能?为什么它会让事情变得更轻松?

4 个答案:

答案 0 :(得分:78)

  

您作为开发人员如何使用此

致电setRetainInstance(true)。我通常会在onCreateView()onActivityCreated()中使用它。

  

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

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

答案 1 :(得分:45)

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

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

答案 2 :(得分:26)

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

<强> FALSE

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

<强> TRUE

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

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

答案 3 :(得分:1)

不建议使用setRetainInstance(boolean)方法,请改用ViewModels。

从片段API的deprecated版本开始,片段上的// before ajax send $("#my_form p.error").remove(); $("#my_form input").removeClass('b-error') ... $.ajax ... if (data.result == 'success') { ... } else if (data['result'] == 'error') { Object.keys(data['response'].forEach(function(key) { $("#my_form input[name='" + key + "'") .addClass('b-error') .after('<p class="error">' + data['response'][key] + '</p>') }) } 方法为1.3.0

随着ViewModels的推出,开发人员拥有一个特定的API,用于保留可以与“活动”,“片段”和“导航”图相关联的状态。这样一来,开发人员就可以使用正常的,未保留的Fragment并将他们想要保留的特定状态分开保存。

这可确保开发人员为这些Fragment(与它们的所有其余Fragments都匹配)提供更可理解的生命周期,同时保持单个创建和单个销毁的有用属性(在这种情况下,{ {1}}和setRetainInstance(boolean)中的ViewModel回调)。