Android在切換Fragment過程中,如何避免重新載入
這是公司的新專案,MainActivity中是集合了多個Fragment,同時,Fragment 中又用ViewPager 嵌套了多個Fragment
所以在MainActivity中,為了避免滑動衝突,通過FragManager 進行Fragment 的切換操作
但是,同時也產生了一個問題。這裡先賣個關子,我們先看下Frament的生命週期圖
這是一張很常見的週期圖,選自網路。
現在,我把相關的日誌打印出來。
接著,我試圖切換下Fragment ,同樣,打印出相對應的日誌
可以看出,在第二個Fragment Create之後,第一個Fragment 就根據生命週期的流程被銷燬了
最後,我們再切回第一個Fragment
所執行的順序和第一個Fragment 切換到第二個Fragment 的流程是一樣的。
於是問題就來了,如果我們Fragment 中可能包含需要非同步載入或者呼叫快取等操作的時候。
需要按照生命週期重新進行Fragment 進行載入,這無論是對於時間還是流量開銷都是比較大的。
現在,我們就來解決這個問題。
------------------------------------------------------------------------------------------------------------------------華麗的分割線------------------------------------------------------------------------------------------
解決方案: 在Activity 中新增該方法
//宣告一個Fragment private Fragment mFrag; //建立用於存放Fragment的集合 <span style="color:#000080;">private List<Fragment> frags = new ArrayList<>();</span> //進行Fragment 載入的方法,position 是Activity 中選中Fragment在Tab中的序號 private void loadFragment(int position) { //從集合中獲取相對序號的Fragment Fragment f = frags.get(position); fragmentTransaction = fragmentManager.beginTransaction(); //首先判斷mFrag 是否為空,如果不為,先隱藏起來,接著判斷從List 獲取的Fragment是否已經新增到Transaction中,如果未新增,新增後顯示,如果已經新增,直接顯示 if(mFrag != null) { fragmentTransaction.hide(mFrag); } if(!f.isAdded()) { fragmentTransaction.add(R.id.flMain, f); } else { fragmentTransaction.show(f); } //將獲取的Fragment 賦值給宣告的Fragment 中,提交 mFrag = f; fragmentTransaction.commit(); }
呼叫該方法後,重新執行程式,同樣的,列印日誌,檢視結果
跳轉到第一個Fragment 時打印出的日誌
接著,跳轉到第二個Fragment
忽略那條JSON資料,可以看出,建立第二個Fragment 時只是按生命週期建立了第二個Fragment ,然而第一個Fragment 並沒有被銷燬
為了證明該方法確實有用,我們把Fragment 再切換回第一個Fragment
很好,Logcat並未顯示有關Fragment 宣告週期的日誌,這說明在切換到一個已建立的Fragment 後,不再重新啟動一個相關的生命週期,這節約了載入的時間和流量
ps:可以把該方法寫入到基類中,封裝後可重複使用,沒必要重複造輪子。