美文网首页
Android-Fragment生命周期和add、replace

Android-Fragment生命周期和add、replace

作者: 九号锅炉 | 来源:发表于2019-01-15 19:41 被阅读0次

    问题场景:

    项目中遇到一个问题:从FragmentA切换到FragmentB之后再返回到FragmentA时,出现FragmentA的一个成员变量mPresenter为空指针的问题。以下代码是常用的动态加载fragment的方法,我在创建fragment时已经给presenter设置了,而且通过debug和打log的方式确定presenter不为null.为什么从另一个fragment返回之后就变成null了呢?

        FragmentManager fm = getSupportFragmentManager();
        FragmentTransaction transaction = fm.beginTransaction();
        FragmentA fragmentA = new FragmentA();
        fragmentA.setPresenter(mPresenter);
        transaction.replace(containerID, fragmentA);
        transaction.addToBackStack(null);
        transaction.commit();
    

    问题分析:

    以上问题说明切换fragment会将原来的fragment销毁,而重新创建fragment时没有重新调用setpresenter(),所以presenter为空指针。因此如何保证原来的fragment不被销毁,在replace时fragment的生命周期是怎么样的?replace和add有什么区别?addToBackStack()对生命周期有什么影响?

    代码复现:

    通过打log的方式跑一边fragment生命周期可以得出以下结论:
    1.使用replace加载fragment,增加addToBackStack(),原来Fragment不会销毁,但是会销毁视图和重新创建视图(回调onDestroyView和onCreateView)
    2.使用replace加载fragment,不增加addToBackStack,fragment会销毁(回调onDestroy)
    3.使用add,hide,show,fragment不销毁也不销毁视图,不走生命周期。

    结论:

    因此可以使用add,hide,show的方式来切换fragment防止fragment被销毁和重建。

    相关文章

      网友评论

          本文标题:Android-Fragment生命周期和add、replace

          本文链接:https://www.haomeiwen.com/subject/fgfudqtx.html