我有適配器viewPager,我實例化片段並在getItem()方法中返回它。所以當我在第一頁時,我只有兩個片段活着。當我旋轉手機時,它們都被破壞並收集垃圾(系統調用它們的onDestroy()和onDetach(),我可以在.hprof內存轉儲中看到它們作爲垃圾回收準備好)。但是,當由於某種原因使用新viewpager和2個新片段創建新活動時,系統會爲先前銷燬的那些創建另外2個片段,並將它們附加到活動中,而不會將它們添加到viewPager中。他們只是坐在fragmentManager的mActive和mAdded數組中。當我旋轉設備幾次時,它會每次創建這些新實例。現在,這可能看起來像一個泄漏,導致碎片不被垃圾收集,但他們確實是。所有這些片段具有不同的@xxx編號,並且在新的片段管理器中接近新活動。我已經嘗試了一切,任何幫助或建議非常感謝,謝謝!片段重新生成並自行添加到活動
回答
ViewPager處理它顯示的碎片的生命週期。正如你所提到的,它會創建可見的片段和旁邊的片段(如果與FragmentStatePagerAdapter
一起使用),以便能夠在時間到達時順利地滑入片段。當片段不在視線內時,可以按照其意願將其刪除並重新創建ViewPager
。
旋轉屏幕的默認大小是該活動與ViewPager
和Fragments
一起重新創建。 但是這可以改變。 通過清單中的android:configChanges="orientation"
,您可以防止在定位更改時重新創建活動。 保留片段實例的方向更改的另一種方法是在要保留的片段中調用setRetainInstance(true)
。
那麼,這幾乎發生在我的情況。我看着第一頁,然後旋轉屏幕。活動被破壞,碎片被破壞。使用新的片段管理器和新的視圖製作器創建新活動。現在,片段管理器創建2個新片段,並將它們添加到活動和viewPager的適配器中。到目前爲止這麼好,但是additionaly會發生的是FragmentManager創建了2個片段,並且只將它們附加到活動中,而不將它們添加到viewpager的適配器中。現在我有4個碎片。當我再次旋轉時,它會創建2個正常碎片和4個碎片。等等。 –
您確定沒有查看碎片的舊丟棄實例嗎? – Juan
我把breakpiont放在這個片段的onCreateView中。首先我輸入它被稱爲兩次的活動。第一次旋轉4次後,再6次,依此類推。這些碎片被丟棄。但在他們的位置,它總是創造出與他們相同的數量,另外還有2個被添加並向用戶顯示 –
所以我這是(意外的:D)錯誤的代碼。我在Activity的onRestoreInstanceState()中創建並設置了新的適配器,因此它將舊片段放在後臺。抱歉無法解決無法回答的問題。
- 1. Pandoc:自動生成並自動重新加載reveal.js幻燈片降價修改
- 2. 從活動AlertDialog添加到片段ArrayAdapter
- 3. 不能將片段添加到活動
- 4. 添加擴展片段到活動
- 5. 當活動完成時重新加載片段
- 6. Yii2:將字段添加到自動生成的CRUD(自動?)
- 7. 重新加載活動來重新切換片段
- 8. 在活動中重新啓動片段
- 9. 重新加載片段從意向獲取回到活動
- 10. 開始新的活動,並將它們添加到基於片段的佈局
- 11. 活動到片段1,片段1到片段2片段2到活動
- 12. 安卓完成活動並重新加載先前活動
- 13. 更新來自活動的片段
- 14. 如何添加片段主要活動
- 15. 添加片段破壞活動
- 16. Android:爲活動添加片段
- 17. 從片段輸入新活動並返回時片段活動被破壞
- 18. 從活動轉到片段並轉到另一個片段
- 19. 從片段完成活動
- 20. OnDetach/onAttach片段重新創建片段活動
- 21. 從片段到活動的重構
- 22. 刷新活動,活動從片段
- 23. 動態地添加多個片段到我的活動佈局
- 24. 從主要活動調用片段添加片段
- 25. 當添加另一個片段時,片段活動變爲空
- 26. 刷新並加載先前活動的一個特定片段
- 27. 片段,活動,片段活動
- 28. jQuery自動生成活動
- 29. 當活動中的asynctask完成如何重新加載ui的片段?
- 30. 如何從一個活動重新加載Viewpager的片段
這是ViewPager的工作原理。這是你的問題? – Juan
以及我有其他viewPagers,我用類似的方式,他們不這樣做。總是隻有正在顯示的片段和旁邊的片段。但是當我旋轉手機時,它們全都被破壞,不會再重新創建。我的意思是,viewPager可能按預期工作,因爲它應該銷燬屏幕旋轉中的所有片段。我只是不知道爲什麼他們正在被重新創建沒有目的 –