我有一个运行支持 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)) …Run Code Online (Sandbox Code Playgroud) android android-lifecycle android-fragments android-viewpager android-support-library
我找了一个解释,但一直找不到.为什么这段代码有效?具体来说 - 为什么可以访问实例的私有成员?据我所知,只有在原始类中的方法中创建实例时,它才有效.
public class MyClass {
private int thing;
public MyClass () {}
public MyClass makeMe () {
MyClass myClass = new MyClass();
myClass.thing = 1;
return myClass;
}
}
Run Code Online (Sandbox Code Playgroud)