2017-05-21 32 views
0

我有適配器viewPager,我實例化片段並在getItem()方法中返回它。所以當我在第一頁時,我只有兩個片段活着。當我旋轉手機時,它們都被破壞並收集垃圾(系統調用它們的onDestroy()和onDetach(),我可以在.hprof內存轉儲中看到它們作爲垃圾回收準備好)。但是,當由於某種原因使用新viewpager和2個新片段創建新活動時,系統會爲先前銷燬的那些創建另外2個片段,並將它們附加到活動中,而不會將它們添加到viewPager中。他們只是坐在fragmentManager的mActive和mAdded數組中。當我旋轉設備幾次時,它會每次創建這些新實例。現在,這可能看起來像一個泄漏,導致碎片不被垃圾收集,但他們確實是。所有這些片段具有不同的@xxx編號,並且在新的片段管理器中接近新活動。我已經嘗試了一切,任何幫助或建議非常感謝,謝謝!片段重新生成並自行添加到活動

+0

這是ViewPager的工作原理。這是你的問題? – Juan

+0

以及我有其他viewPagers,我用類似的方式,他們不這樣做。總是隻有正在顯示的片段和旁邊的片段。但是當我旋轉手機時,它們全都被破壞,不會再重新創建。我的意思是,viewPager可能按預期工作,因爲它應該銷燬屏幕旋轉中的所有片段。我只是不知道爲什麼他們正在被重新創建沒有目的 –

回答

1

ViewPager處理它顯示的碎片的生命週期。正如你所提到的,它會創建可見的片段和旁邊的片段(如果與FragmentStatePagerAdapter一起使用),以便能夠在時間到達時順利地滑入片段。當片段不在視線內時,可以按照其意願將其刪除並重新創建ViewPager

旋轉屏幕的默認大小是該活動與ViewPagerFragments一起重新創建。 但是這可以改變。 通過清單中的android:configChanges="orientation",您可以防止在定位更改時重新創建活動。 保留片段實例的方向更改的另一種方法是在要保留的片段中調用setRetainInstance(true)

+0

那麼,這幾乎發生在我的情況。我看着第一頁,然後旋轉屏幕。活動被破壞,碎片被破壞。使用新的片段管理器和新的視圖製作器創建新活動。現在,片段管理器創建2個新片段,並將它們添加到活動和viewPager的適配器中。到目前爲止這麼好,但是additionaly會發生的是FragmentManager創建了2個片段,並且只將它們附加到活動中,而不將它們添加到viewpager的適配器中。現在我有4個碎片。當我再次旋轉時,它會創建2個正常碎片和4個碎片。等等。 –

+0

您確定沒有查看碎片的舊丟棄實例嗎? – Juan

+0

我把breakpiont放在這個片段的onCreateView中。首先我輸入它被稱爲兩次的活動。第一次旋轉4次後,再6次,依此類推。這些碎片被丟棄。但在他們的位置,它總是創造出與他們相同的數量,另外還有2個被添加並向用戶顯示 –

0

所以我這是(意外的:D)錯誤的代碼。我在Activity的onRestoreInstanceState()中創建並設置了新的適配器,因此它將舊片段放在後臺。抱歉無法解決無法回答的問題。