我指的是Why use Fragment#setRetainInstance(boolean)?是用碎片的setRetainInstance(真)真的是一個很好的做法來處理旋轉變化
我之所以問那麼是Activity
來處理旋轉,Official Activity Documentation鼓勵我們,讓Activity
關機和輪換期間重新啓動
android:configChanges列出活動 將自行處理的配置更改。當運行時發生配置更改時, 活動默認關閉並重新啓動,但使用此屬性聲明 配置將會阻止重新啓動活動 。相反,該活動仍在運行,並調用其onConfigurationChanged()方法。注意:應該避免使用此屬性 ,並僅將其用作最後的手段。請閱讀處理 運行時間更改以瞭解有關如何正確處理由於配置更改而導致的重新啓動 的更多信息。
任何嘗試更改此Activity默認行爲似乎都是不好的做法。爲避免重新啓動時重新加載耗時的數據結構,我們使用onRetainNonConfigurationInstance
和getLastNonConfigurationInstance
。 - Official Handling Runtime Changes
但是,當涉及處理片段中的旋轉時,Google會給我們不同的建議嗎?他們不希望我們關閉並重新啓動Fragment?
public Object onRetainNonConfigurationInstance()
此方法已被廢棄在代替API級別13.使用新片段API setRetainInstance(布爾值);通過Android兼容性軟件包,舊款 平臺也可以使用此功能。
- 爲什麼谷歌鼓勵我們關停和旋轉過程中重新啓動活動,但鼓勵我們旋轉過程中保持片段?
- 如果
setRetainInstance(true)
擅長處理輪換,Google爲什麼不將它作爲Fragment的默認行爲?
是的忘記了爲什麼它不聰明的使用視圖,但上下文泄漏是答案。 – Warpzit 2013-02-25 12:03:11
**「只能與不包含任何將在循環中重新創建的引用的片段一起使用。」**我不太確定這是否100%準確。如果保留的片段在'onActivityCreated(Bundle)'中設置了對父Activity的引用(這將在每次配置更改後在保留的片段中調用),那麼這應該不足以確保保留的'Fragment'從來沒有提到一箇舊的「活動」? – 2013-04-22 00:10:12
@AlexLockwood如果你看源代碼,'FragmentManager'設置一個片段的'mActivity'字段爲其在attach時的父活動,並且當該片段被分離時,也將其設置回null **。在可由'getActivity()'訪問的片段中。因此,並不總是需要存儲對父活動的另一個引用,並且如果這樣做,則必須在分離時清除/釋放它。誠然,如果你足夠小心以確保你不會泄漏上下文引用,你可以以任何方式使用它。我的目的是阻止在任何Fragment上無意識地使用'setReatainInstance()'。 – 2013-04-22 04:52:00