问题场景:
项目中遇到一个问题:从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被销毁和重建。
网友评论