更新的答案:
在哪些情况下我可能会遇到麻烦?
将 a 添加Fragment
到后台堆栈并在配置更改时将 aBundle
从Fragment
from传递onSaveInstanceState()
到。onCreateView()
调用setRetainInstance(true)
将在配置更改时将 设置Bundle
为空。
(我不确定开发人员是否真的会尝试这样setRetainInstance(true)
做,因为 usingonSaveInstanceState()
有点多余,但我没有看到 API 文档中记录的行为,所以我写了这个答案)。
如果同时调用 和 ,则addToBackStack()
与仅调用 相比,会在配置更改setRetainInstance(true)
时setRetainInstance()
部分更改Fragment
生命周期方法调用和参数值addToBackStack()
。
addToBackStack()
具体来说,在下面的测试中,查看仅调用和调用之间的差异setRetainInstance(true)
,并查看配置更改会发生什么:
打电话addToBackStack()
但不打电话setRetainInstance(true)
;
onCreate()
并被onDestroy()
调用。
- 传入的包
onSaveInstanceState()
作为参数接收onCreateView()
。
同时调用addToBackStack()
和setRetainInstance(true)
:
onCreate()
并且onDestroy()
不被调用。这在 API 文档中有所提及。
- 从 传递的捆绑包
onSaveInstanceState()
未在 中接收onCreateView()
。传入的Bundle
为空。
记录方法调用和参数的测试是否为空:
在Activity
:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
MyFragment fragment;
if (savedInstanceState != null) {
fragment = (MyFragment) getFragmentManager().findFragmentByTag("my_fragment_tag");
} else {
fragment = new MyFragment();
FragmentTransaction t = getFragmentManager().beginTransaction();
t.addToBackStack(null);//toggle this
t.add(android.R.id.content, fragment, "my_fragment_tag").commit();
}
}
在Fragment
:
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
setRetainInstance(true);//toggle this
}
和
@Override
public void onSaveInstanceState(Bundle outState) {
outState.putString("test", "value");
super.onSaveInstanceState(outState);
}
测试1:片段生命周期何时被addToBackStack()
调用,setRetainInstance(true)
未被调用
- onAttach()
- onCreate()
- onCreateView()
- onActivityCreated()
- 开始()
- onResume()
[设备从纵向旋转到横向]
- 暂停()
- onSaveInstanceState()
- 停止()
- onDestroyView()
- onDestroy()
- onDetach()
- onAttach()
- onCreate()
- 带有捆绑参数的 onCreateView() != null
- 开始()
- onResume()
测试 2 和 3:片段生命周期调用,setRetainInstance(true)
调用、addToBackStack()
调用/未调用(结果相同):
- onAttach()
- onCreateView()
- onActivityCreated()
- 开始()
- onResume()
[设备从纵向旋转到横向]
- 暂停()
- onSaveInstanceState()
- 停止()
- onDestroyView()
- onDetach()
- onAttach()
- onCreateView() 与捆绑参数 == null
- 开始()
- onResume()