boz*_*zle 5 android android-lifecycle android-fragments android-viewpager android-support-library
我有一个运行支持 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);
}
}
Run Code Online (Sandbox Code Playgroud)
以上是重新创建后正确调用swapFragment,证明保留了中间片段。然而:
public void swapFragment(String key) {
//use passed key to organise displayed fragment in shell
FragmentManager childFragMngr = getChildFragmentManager();
Run Code Online (Sandbox Code Playgroud)
'childFragMngr' 不包含任何片段——此时 mAdded 和 mActive 在调试器中都是空的,这很奇怪,因为 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();
}
}
}
Run Code Online (Sandbox Code Playgroud)
任何帮助将不胜感激。
| 归档时间: |
|
| 查看次数: |
1447 次 |
| 最近记录: |