問題場景:
項目中遇到一個問題:從FragmentA切換到FragmentB之后再返回到FragmentA時背稼,出現(xiàn)FragmentA的一個成員變量mPresenter為空指針的問題贰军。以下代碼是常用的動態(tài)加載fragment的方法,我在創(chuàng)建fragment時已經(jīng)給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銷毀,而重新創(chuàng)建fragment時沒有重新調(diào)用setpresenter()帘腹,所以presenter為空指針寒跳。因此如何保證原來的fragment不被銷毀,在replace時fragment的生命周期是怎么樣的竹椒?replace和add有什么區(qū)別童太?addToBackStack()對生命周期有什么影響?
代碼復現(xiàn):
通過打log的方式跑一邊f(xié)ragment生命周期可以得出以下結論:
1.使用replace加載fragment,增加addToBackStack(),原來Fragment不會銷毀书释,但是會銷毀視圖和重新創(chuàng)建視圖(回調(diào)onDestroyView和onCreateView)
2.使用replace加載fragment,不增加addToBackStack,fragment會銷毀(回調(diào)onDestroy)
3.使用add,hide,show,fragment不銷毀也不銷毀視圖翘贮,不走生命周期。
結論:
因此可以使用add,hide,show的方式來切換fragment防止fragment被銷毀和重建爆惧。