Android-Fragment生命周期和add、replace

2019-01-15  本文已影响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被销毁和重建。

上一篇下一篇

猜你喜欢

热点阅读