ViewPager中切換介面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
https://www.bkjia.com/topicnews.aspx?tid=11
本文永久更新連結地址:https://www.bkjia.com/Linux/2018-02/151005.htm