我发现Fragment #setRetainInstance(true)令人困惑。这是从Android Developer API:
中提取的Javadocpublic void setRetainInstance (boolean retain)
控制是否在活动重新创建(例如从配置更改)中保留片段实例。这只能用于不在后栈中的片段。如果设置,则重新创建活动时片段生命周期将略有不同:
- onDestroy()将不会被调用(但onDetach()仍然会被调用,因为片段正在与其当前活动分离。)
- onCreate(Bundle)将不会被调用,因为片段没有被重新创建。
- onAttach(活动)和onActivityCreated(捆绑) 仍然会被调用。
问题:作为开发人员,您如何使用此功能?为什么它会让事情变得更轻松?
答案 0 :(得分:78)
您作为开发人员如何使用此
致电setRetainInstance(true)
。我通常会在onCreateView()
或onActivityCreated()
中使用它。
为什么它会让事情变得更容易?
它比onRetainNonConfigurationInstance()
更容易处理跨配置更改的数据保留(例如,将设备从纵向旋转到横向)。在配置更改时销毁并重新创建未保留的片段;保留的片段不是。因此,这些保留的片段保存的任何数据都可用于配置后更改活动。
答案 1 :(得分:45)
这对于保持长时间运行的资源(例如套接字)非常有帮助。拥有一个无UI的片段,可以保存对蓝牙套接字的引用,当用户翻转手机时,您不必担心重新连接它们。
保持对需要很长时间加载的资源(如位图或服务器数据)的引用也很方便。加载一次,将其保留在保留的片段中,当重新加载活动时,它仍然存在,您不必重建它。
答案 2 :(得分:26)
很晚才添加这个答案,但我认为这会让事情变得更清晰。跟我说吧。当setRetainInstance为:
时<强> FALSE 强>
<强> TRUE 强>
不要忘记以上内容适用于DialogFragments以及Fragments。
答案 3 :(得分:1)
从片段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
回调)。