小编boz*_*zle的帖子

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

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

5
推荐指数
0
解决办法
1447
查看次数

我怎么能在类中引用实例的私有字段?

我找了一个解释,但一直找不到.为什么这段代码有效?具体来说 - 为什么可以访问实例的私有成员?据我所知,只有在原始类中的方法中创建实例时,它才有效.

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)

java private

1
推荐指数
1
解决办法
67
查看次数