2011-11-10 40 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片段的连接。