1. 程式人生 > >fragment+viewpager第二次載入頁面時顯示空白的原因!

fragment+viewpager第二次載入頁面時顯示空白的原因!

在編寫一個底層有三個RadioButton,中間層是一個Linearlayout的app的的時候,在每個radiobutton對應的向Linearlayout中新增fragment,第二個有點特殊,不是直接的加入fragment而是加入了一個viewpager,並且在viewpager裡面添加了fragment進行切換.

於是問題來了 :在切換不同介面的時候 第一次讀取viewpager的時候可以顯示裡面的fragment並且可以自由的切換。當讀取另外一個radiobutton的時候再切換回來,viewpager裡面顯示的成為了空白,這個問題困擾了我大半天,頭也是夠疼的。找了各種部落格看了各種文章又看了看原始碼。最終搞懂了其中奧祕。

就在這裡給大家小小的解釋一下。

首先,我們所寫的Viewpager的adatper 有可能繼承自三個類 一個是PagerAdapter,另一個是FragmentPagerAdapter,最後一個是FragmentStatePagerAdapter。

後兩個都是PagerAdapter的子類,當然相比父類,我們優化了很多新的功能並且簡化了很多程式碼。

說了這麼多,主要原因還是因為對Frgament的生命週期不是很理解。

轉轉好的文章http://blog.csdn.net/forever_crying/article/details/8238863/

在每次載入viewpager的時候都會呼叫viewpager裡面的OncreatView方法 所以會造成原有的已經載入好的view被新的頁面所覆蓋,導致在第二次開啟viewpager的時候會顯示空白。

說說主要原因,是因為我們所自定義寫的Adapter繼承自FragmentPagerAdapter,而FragmentPagerAdapter該類內的每一個生成的 Fragment 都將儲存在記憶體之中,因此適用於那些相對靜態的頁,數量也比較少的那種;而我們動態載入這些fragment的時候消耗的記憶體更多,所以導致我們在載入fragment的時候遇到了白屏。所以選擇繼承自FragmentStatePagerAdapter才能解決問題,和 FragmentPagerAdapter 不一樣的是,正如其類名中的 'State' 所表明的含義一樣,該 PagerAdapter 的實現將只保留當前頁面,當頁面離開視線後,就會被消除,釋放其資源;而在頁面需要顯示時,生成新的頁面(就像 ListView 的實現一樣)。這麼實現的好處就是當擁有大量的頁面時,不必在記憶體中佔用大量的記憶體。