Android嵌套片段生命周期配置更改

时间:2014-07-22 07:16:46

标签: android android-fragments android-viewpager android-support-library android-lifecycle

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

非常感谢任何帮助。

0 个答案:

没有答案