2012-11-07 33 views
18

我有一個ViewPager與FragmentPagerAdapter,我的應用程序以前只使用兩個片段(不同類型)沒有問題。如何告訴我的自定義FragmentPagerAdapter停止銷燬我的碎片?

雖然我剛剛添加了第三個片段,但現在我的適配器/ viewpager似乎在我遠離它們時正在銷燬我的碎片。例如,如果我在頁面1上,那麼當我接近它時,頁面3會被銷燬並重新創建。如果我在第3頁上,同樣發生在第1頁上。

這在我的應用程序中導致了很多問題。這些碎片根本不是很重的RAM,所以我怎樣才能阻止這種情況的發生?

+0

是它破壞片段或破壞景觀? – DeeV

+0

我不確定。我將如何檢查? –

+1

你剛纔說「這導致了很多問題。」如果碎片被破壞,那麼它的狀態正在從內存中擦除,重新加載時重置爲默認值。 – DeeV

回答

43

我相信你正在尋找ViewPager.setOffscreenPageLimit()

在你的情況下,以下應該保留你的片段在內存中,而不是銷燬它們。

ViewPager pager = (ViewPager) findViewById(R.id.viewPager); 
pager.setOffscreenPageLimit(2); 

但是,我懷疑你在被銷燬時沒有正確存儲你的視圖狀態。你的碎片應該正確處理被破壞/重新創建。例如,如果方向改變發生,你的碎片也會被銷燬並重新創建。如果用戶離開您的應用程序並且系統稍後需要內存並破壞您的活動,也可能發生這種情況。它應該能夠重新開放,並且與以前一樣處於相同的狀態。如果這確實是您的問題,請考慮在onSaveInstanceState()中保存狀態。已保存的狀態將在onCreate中呈現給您,您可以在其中初始化片段的狀態,使其與被銷燬的狀態相同。

+0

完美!這是我的臨時解決方案,直到我使我的片段更獨立於網絡。 –

+0

這幫了我很多!謝謝! – JozeRi

+1

onSaveInstanceState()不會被調用大部分時間。例如,你在第1頁,轉到第5頁:第一個片段例如通過onDestroyView(),而不是onSaveInstanceState()。至少在我的情況。 – natario

4

只是重寫此方法FragmentpagerAdapter

@Override 
public void destroyItem(ViewGroup container, int position, Object object) { 
     // TODO Auto-generated method stub 
     super.destroyItem(ViewGroup container, int position, Object object); 
} 

從代碼中刪除super.destroyItem(ViewGroup container, int position, Object object);

+0

只要你不希望你的Fragment被破壞(即使FragmentPagerAdapter超出範圍),這將會工作。這可能是有問題的,但在某些情況下,它是完美的。對於這些問題的情況,你總是可以自己調用'destroyItem(..)'。 –

+0

非常感謝你的解決方案:) –