事先搜索了關於這個問題的內容,我可以找到許多有關動態地添加和從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
與其父母分離時,是否有一種方法可用於刪除ViewPager
的Fragment
?換句話說,當我知道ViewGroup
不再使用時,我會在某處(可能在FragmentPagerAdapter
)執行FragmentTransaction
以刪除那些Fragment
。
或者,我意識到我可以只將ViewPager
永久保留在其中,並動態地將Fragment
秒交換。當然,在某些時候它只能保持一頁就沒關係了。如果這是更好的方法,那麼我會重構我的代碼來做到這一點,但我會欣賞意見。
謝謝。我剛纔提出的解決方案是在destroyItem中使用'FragmentManager'來移除'Fragment'。我還從'getItemPosition'返回'PagerAdapter.POSITION_NONE'並調用'notifyDataSetChanged()'。通過在刪除'ViewPager'之前執行此操作,將調用'片段'onDestroy',我很高興。你看到這個問題嗎?使用'FragmentPagerAdapter'的原因是因爲我希望所有的'Fragment's(一小部分)都呆在附近,因爲我的UI需要用戶數據從所有片段中持久化以響應單個接受按鈕操作。 – Trevor
@Trevor:「你看到這個問題嗎?」 - 這應該沒問題,但在對Android支持包進行任何更新時要小心。對於我們所知的一切,他們會改變行爲,以至於Android也會嘗試銷燬碎片,並且可能會發生錯誤,並且必須退出自己的銷燬邏輯。 – CommonsWare
再次感謝您,並理解。看來我現在擁有的東西是兩全其美的:使用'FragmentPagerAdapter'意味着遠離'Fragment'的分頁不會破壞它,但通過擴展'destroyItem'來移除片段就像'FragmentStatePagerAdapter'一樣,我可以當我想要時刪除碎片。 (我讚賞要求所有附加片段留在周圍,以便我可以請求他們立即保存用戶輸入數據可能會被忽略,但否則我將不得不重構,以便所有片段將此數據傳遞給主Activity,即I 'd寧可避免。) – Trevor