我有一个运行支持viewPager的活动,它由片段(支持库变体)组成,它们本身由三个可能的片段之一组成。鉴于Android操作系统会破坏并重新创建有关配置更改的活动(特别是屏幕旋转),我决定在运行AsyncTasks时保留中间片段。孩子们也可能正在运行其他线程,因此他们也需要保留。我当前担心的是:
1)虽然viewPager中的片段调用了onDetach()方法,但这些片段的子节点永远不会到达onStop(),onDestroy()或onDetach()。无论他们的实例是否被保留,都应该调用onDetach(),因为活动被销毁了。
2)尽管从未停止过,但对儿童片段的引用仍然存在;当重新创建活动并重新连接中间片段时,他们无法使用getChildFragmentManager()。findFragmentByTag(key)找到子节点。
编辑 - 来自viewpager运行的中间片段的一些相关代码:
@Override
public void onActivityCreated (Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
if(cachedLocation==null) {
new WaitForLocation().execute(mCallback);
}
else {
swapFragment(LTAG);
}
}
以上是在重新创建后正确调用swapFragment,并证明中间片段被保留。但是:
public void swapFragment(String key) {
//use passed key to organise displayed fragment in shell
FragmentManager childFragMngr = getChildFragmentManager();
' childFragMngr'不包含任何片段 - 此时调试器中的mAdded和mActive都为null,这很奇怪,因为从不触及onStop()和onDetach()方法。
if(childFragMngr.findFragmentByTag(key)==null) {
Fragment mFragment = null;
if(key.equals(listFragmentTag)) {
//instantiate a list fragment
mFragment = createListFragment();
}
else if(key.equals(detailFragmentTag)) {
//instantiate a detail fragment
mFragment = createDetailFragment();
}
}
if(mFragment!=null){
getChildFragmentManager().beginTransaction().replace(R.id.subfragment_shell, mFragment, key)
.addToBackStack(null)
.commit();
}
}
}
非常感谢任何帮助。