我有一个运行支持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();  
        }
    }
}

任何帮助将不胜感激 .