2011-11-10 69 views
5

我在理解如何製作一個簡單的DialogFragment來編輯一個(複雜)對象,比如一個Person,名字和姓氏,以及一個電子郵件地址列表,每個都包含一個枚舉(工作,家庭等)和地址。Android DialogFragment和配置更改

首先,我該如何正確地將Person對象傳遞給DialogFragment?我目前的解決方案有一個setPerson(Person person)方法,這是在創建DialogFragment之後調用的,但是在dialog.show()之前調用。這工作正常,直到發生配置更改(用戶旋轉屏幕)。 DialogFragment被重新創建,並且對Person對象的引用爲空。我知道我可以使用onSaveInstanceState保存實例,但該對象非常複雜且昂貴,並且以這種方式保存大對象似乎很浪費。

我也試過在使用我的對話框的活動中禁用配置更改,並修復了問題,但我希望對話框可以重複使用,並要求所有使用它的活動禁用配置更改似乎是錯誤的。

第三種選擇是將引用保存到一個靜態變量中,但同樣我希望該對話框是可重用的並且能夠支持多個實例。

其他人如何在可重複使用的對話框中處理昂貴且複雜的對象?

回答

2

好吧,有幾種解決方案,如果你完全無法序列化你正在編輯的對象,那麼這些解決方案都不是太棒了,也不是安全的。

我不推薦使用android:configChanges="orientation",除非它絕對是100%不可避免的。還有其他配置更改,如果您訴諸使用該解決方案,您的應用仍然會與其他配置發生衝突。

但是,在絕大多數情況下,一個簡單的解決方案是在DialogFragment上調用setRetainInstance(true)。這將防止您的碎片在配置更改時被破壞和重新創建。儘管如此,這種情況可能不起作用。除了配置更改之外,還有其他一些原因會導致操作系統嘗試將某個活動或應用程序「放在冰上」,例如爲了節省內存。在這種情況下,你的物體將會丟失。

1

到一個複雜的對象傳遞給一個片段的乾淨的方法是使對象實現Parcelable,將該對象添加到一個Bundle,並通過束到Fragmentfragment.setArguments(bundle)。您可以通過調用來檢索該分組,從而對該分段的對象onActivityCreated()進行解壓縮。

要保留參數上配置改變,只需將「工作」 parcelable對象保存到由該片段的方法提供的束,並且如果稍後savedInstanceState !=null解壓縮參數在onActivityCreated()

如果執行Parcelable時出現明顯的性能下降,或者您有某種「實時」對象,則一種選擇是創建一個非UI片段來容納該數據對象。沒有深入細節,您可以在非UI片段上使用setRetainInstance(true),並通過Activity中的接口協調與UI片段的連接。