ViewPager中切換界面Fragment被銷毀的問題分析 使用ViewPager+Fragment實現界面切換,當界面數量大於3時,出現二次滑動後數據消失的情況,下麵由Fragment生命周期進行分析 簡單解析: 使用pager=3進行測試,當界面由2切換到1的時候,3界面對應的Fragment ...
ViewPager中切換界面Fragment被銷毀的問題分析
使用ViewPager+Fragment實現界面切換,當界面數量大於3時,出現二次滑動後數據消失的情況,下麵由Fragment生命周期進行分析
簡單解析:
使用pager=3進行測試,當界面由2切換到1的時候,3界面對應的Fragment實際上走瞭如下流程:
1 -->onPause
2 -->onStop
3 -->onDestroyView
再由1切換回2或者3時,3界面對應的Fragment的執行流程:
1 -->onCreateView
2 -->onStart
3 -->onResume
界面3對應的Fragment被銷毀並重新創建。
ViewPager的預設載入方式是緩存當前界面前後相鄰的兩個界面,即最多共緩存包括當前界面在內的三個界面信息。當滑動切換界面的時候,非相鄰界面信息將被釋放。
界面2是當前界面,界面1和3是緩存界面,當切換到1時,界面2仍緩存,界面3被銷毀釋放,於是便有了onDestroyView的調用。
由1切換到2或3時,界面3又被重新創建,於是走了onCreateView流程。
解決方案:
方案一:設置ViewPager的緩存界面數
此方案適用於界面數較少的情況,避免緩存界面太多導致記憶體吃緊。
mPager .setOffscreenPageLimit(2);
參數:int limit — 緩存當前界面每一側的界面數
以上述為例,當前界面為1,limit = 2,表示緩存2、3兩個界面。如此便避免了界面3被銷毀。
方案二:保存狀態並恢復
此方案適用於可用界面信息可由狀態保存和恢復實現的情況。
在onDestroyView方法內保存相關信息,在onCreateView方法內恢覆信息設置。
方案三(推薦):復用Fragment的RootView