我正在設計一個應用程序,允許用戶在ViewPager中的多個頁面之間切換。我一直在努力研究如何從頁面中刪除一個Fragment實例,當它不再在屏幕上可見時將其緩存(對HashMap),然後將其恢復,以便當用戶翻轉回該頁面,其中的視圖和其他所有內容將處於刪除前的相同狀態。例如,我的第一個頁面是一個登錄屏幕,可以使某個特定頁面上的某些佈局元素在成功登錄時可見/不可見。當我翻轉足夠的頁面然後翻回第一頁時,佈局被重置。對於另一個包含巨大的水平/垂直滾動數據網格的頁面來說,這變成了一個問題,我使用背景中的線程在初始化時進行繪製。我使用一個進度對話框來通知用戶加載進度,每次我必須加載時它變得非常煩人。Android:Viewpager和FragmentStatePageAdapter
所以我做了一些研究...
我通過了FragmentStatePageAdapter的源代碼,並在destroyItem()回調瀏覽,片段實例被刪除的狀態保存到一個ArrayList。當在instantiateItem()回調中創建Fragment的新實例時,如果某個項目的實例尚不存在(它們通過使用ArrayList跟蹤此事件),則會創建一個新的Fragment實例並創建其保存的狀態使用相應的Fragment.SavedState數據進行初始化。不幸的是,這些數據並不包含視圖所在的狀態,儘管我注意到對於具有GridView/ListView的頁面,視圖的狀態以某種方式恢復(如果我滾動到某個隨機位置,翻轉幾頁並返回,它不會被重置)。
根據API:
保存的狀態不能包含在其它片段的依賴性 - 即它不能使用putFragment(捆綁,字符串,片段),用於存儲一個 片段引用,因爲當以後使用此保存的狀態時,該引用可能無效。同樣,片段的目標和結果 代碼不包含在此狀態中。
作爲Android的noob,我不太確定我理解最後的聲明。
這就是說,有什麼辦法來緩存視圖狀態?如果沒有,我想我會繼續前進,並將所有的片段頁面留在內存中。
你需要從FragmentStatePagerAdapter繼承,如果你只使用FragmentPagerAdapter然後將的onSaveInstanceState不會被調用。 – Scott