2012-10-07 31 views
5

事先搜索了關於這個問題的內容,我可以找到許多有關動態地添加和從ViewPager中刪除所選Fragment的討論。然而,我在這裏實際上關心的是,如何通過編程方式從包含ViewGroup的「包含」「中乾淨地」刪除整個ViewPager,當ViewPager已用於通過FragmentPagerAdapter顯示Fragment時,並確保包含的Fragment被正確銷燬。以編程方式刪除ViewPager,何時(或如何確保)包含碎片被破壞?

爲了進一步擴展這個問題,我有一個橫向雙窗格佈局,其中從左側的Fragment內的列表中進行選擇,然後將所選內容放置在右側內一個FrameLayout。關鍵是內容可能或不可以分頁。因此,內容必須以ViewPager格式顯示,或者如果未分頁,則應直接以單一Fragment表示。

要顯示一個Fragment,我只需執行FragmentTransaction就如您通常將Fragment放入FrameLayout容器中。另一方面,如果它是分頁顯示的內容,則創建一個ViewPager並將其添加爲FrameLayout的子項。

當我需要更改內容時,如果以前的內容是獨立的Fragment,那麼我可以簡單地通過FragmentTransaction.remove()刪除它。當我這樣做時,Fragment按預期經過onPause() ... onDestroy()週期。如果以前的內容是ViewPager,那麼我使用.removeAllViews()將其從FrameLayout中刪除。在這裏,我遇到了這個問題:我沒有看到onPause() ...... onDestroy()方法在Fragment的任何一箇中通過FragmentPagerAdapter被保存在ViewPager中。

從用戶的角度來看,應用程序工作正常。經過幾輪ViewPager被刪除後,我可以看到GC回收內存。然而,我不喜歡這樣的事實,即那些Fragment的生命終結方法並沒有被調用,因爲我無法對它們進行任何清理,而且這看起來似乎是不正確的。

ViewPager與其父母分離時,是否有一種方法可用於刪除ViewPagerFragment?換句話說,當我知道ViewGroup不再使用時,我會在某處(可能在FragmentPagerAdapter)執行FragmentTransaction以刪除那些Fragment

或者,我意識到我可以只將ViewPager永久保留在其中,並動態地將Fragment秒交換。當然,在某些時候它只能保持一頁就沒關係了。如果這是更好的方法,那麼我會重構我的代碼來做到這一點,但我會欣賞意見。

回答

12

但是,我不喜歡這樣一個事實,那些碎片的生命終結方法並沒有被調用,因爲我不能在它們內部做任何清理工作,而且它看起來似乎是不正確的。

當活動被破壞時,如果這對你來說還不算太晚(例如,堆問題),他們應該被清理乾淨。

換句話說,當我知道ViewGroup不再被使用時,我會在某處(可能在FragmentPagerAdapter中)執行FragmentTransactions來移除這些碎片。

您沒有執行事務將碎片放在那裏。因此,您不能輕易執行事務來刪除碎片。如果切換到FragmentStatePagerAdapter,並調用setAdapter(null),則應通過閱讀源代碼來銷燬尋呼機中所有現有片段。 FragmentPagerAdapter從未使用remove(),但FragmentStatePagerAdapter確實從其destroyItem()方法中獲得,並且當向setAdapter()提供新適配器(或null)時,通過destroyItem()銷燬所有現存碎片。

+1

謝謝。我剛纔提出的解決方案是在destroyItem中使用'FragmentManager'來移除'Fragment'。我還從'getItemPosition'返回'PagerAdapter.POSITION_NONE'並調用'notifyDataSetChanged()'。通過在刪除'ViewPager'之前執行此操作,將調用'片段'onDestroy',我很高興。你看到這個問題嗎?使用'FragmentPagerAdapter'的原因是因爲我希望所有的'Fragment's(一小部分)都呆在附近,因爲我的UI需要用戶數據從所有片段中持久化以響應單個接受按鈕操作。 – Trevor

+1

@Trevor:「你看到這個問題嗎?」 - 這應該沒問題,但在對Android支持包進行任何更新時要小心。對於我們所知的一切,他們會改變行爲,以至於Android也會嘗試銷燬碎片,並且可能會發生錯誤,並且必須退出自己的銷燬邏輯。 – CommonsWare

+1

再次感謝您,並理解。看來我現在擁有的東西是兩全其美的:使用'FragmentPagerAdapter'意味着遠離'Fragment'的分頁不會破壞它,但通過擴展'destroyItem'來移除片段就像'FragmentStatePagerAdapter'一樣,我可以當我想要時刪除碎片。 (我讚賞要求所有附加片段留在周圍,以便我可以請求他們立即保存用戶輸入數據可能會被忽略,但否則我將不得不重構,以便所有片段將此數據傳遞給主Activity,即I 'd寧可避免。) – Trevor

相關問題