setRetainInstance上的文档说:
这只能用于不在后栈中的片段 .
所以我开始玩它 .
我有一个Activity添加第一个frag A
FragmentManager fm = getSupportFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
ft.replace(R.id.content, new PackageFragment());
ft.commit
然后从这个frag我运行一个父Activity的方法,它将frag B添加到backstack
FragmentManager fm = getSupportFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
ft.replace(R.id.content, new OrderFragment());
ft.addToBackStack(null);
ft.commit();
然后我从onCreate,onDestroy,onSaveInstanceState,onActivityCreated ......等创建log msg
我尝试了这个过程的两个版本 . 在每个片段上旋转设备 .
- 默认
一切都如预期 . onCreate,onDestroy on fragment fire
- setRetainInstance(true)
一切都如预期的那样? onCreate,onDestroy片段不要开火
当片段都在后台时,一切似乎都有效..所以为什么文档说我不应该使用它?我可能遇到麻烦的情况是什么?
谢谢
1 回答
更新的答案:
将
Fragment
添加到后端堆栈并在配置更改时将Fragment
中的Bundle
从onSaveInstanceState()
传递到onCreateView()
. 调用setRetainInstance(true)
会在配置更改时将Bundle
设置为null .(我不确定开发人员是否真的会尝试这个,因为使用
setRetainInstance(true)
会使onSaveInstanceState()
变得多余,但我没有看到API文档中记录的行为所以我写了这个答案) .如果同时调用了
addToBackStack()
和setRetainInstance(true)
,则与仅调用addToBackStack()
相比,setRetainInstance()
会部分更改配置更改时的Fragment
生命周期方法调用和参数值 .具体来说,在下面的测试中,查看仅调用
addToBackStack()
和调用setRetainInstance(true)
之间的差异,并查看配置更改时发生的情况:拨打
addToBackStack()
但不是setRetainInstance(true)
;onCreate()
和onDestroy()
被调用 .从
onSaveInstanceState()
传递的包作为onCreateView()
中的参数被接收 .同时调用
addToBackStack()
和setRetainInstance(true)
:onCreate()
和onDestroy()
未被调用 . 这在API文档中提到 .onCreateView()
未收到onSaveInstanceState()
传递的捆绑包 . 传入的Bundle
为空 .对已记录的方法调用和参数测试为null的测试:
在
Activity
:在
Fragment
:和
测试1:调用
addToBackStack()
时的片段生命周期,并且不调用setRetainInstance(true)
onAttach()
onCreate()
onCreateView()
onActivityCreated()
onStart()
onResume()
[设备从纵向旋转到横向]
onPause()
onSaveInstanceState()
onStop()
onDestroyView()
onDestroy()
onDetach()
onAttach()
onCreate()
onCreateView() with bundle param != null
onStart()
onResume()
测试2和3:调用
setRetainInstance(true)
的片段生命周期调用,addToBackStack()
调用/未调用(相同结果):onAttach()
onCreateView()
onActivityCreated()
onStart()
onResume()
[设备从纵向旋转到横向]
onPause()
onSaveInstanceState()
onStop()
onDestroyView()
onDetach()
onAttach()
onCreateView() with bundle param == null
onStart()
onResume()