Android DialogFragment和配置更改

kal*_*lev 5 android

我在理解如何编写一个简单的DialogFragment来编辑一个(复杂的)对象时遇到了一些麻烦,比如一个人,有姓和名,以及一个电子邮件地址列表,每个都包含一个枚举(工作,家庭等) )和地址.

首先,如何将Person对象正确传递给DialogFragment?我当前的解决方案有一个setPerson(Person person)方法,在我创建DialogFragment之后但在dialog.show()之前调用.这可以正常工作,直到配置发生变化(用户旋转屏幕).重新创建DialogFragment,并且对Person对象的引用为null.我知道我可以使用onSaveInstanceState保存实例,但是对象复杂且昂贵,并且以这种方式持久化大对象似乎很浪费.

我也尝试在使用我的对话框的活动中禁用配置更改,并修复了问题,但我希望对话框可以重复使用,并且要求使用它来禁用配置更改的所有活动似乎都是错误的.

第三个选项是将对Person的引用保存在静态变量中,但同样,我希望对话框可重用并且能够支持多个实例.

其他人如何在可重复使用的对话框中处理昂贵而复杂的对象?

Avi*_*rry 3

好吧,有几种解决方案,如果您完全无法序列化正在编辑的对象,那么这些解决方案都不是出色的或万无一失的。

我不建议永远使用,android:configChanges="orientation"除非它是绝对、100%不可避免的。还有其他配置更改,如果您诉诸使用该解决方案,您的应用程序仍然会与其他应用程序一起崩溃。

但适用于绝大多数情况的一个简单解决方案是调用setRetainInstance(true)DialogFragment。这将防止您的片段在配置更改时被破坏和重新创建。不过,在一种极端情况下,这可能不起作用。除了配置更改之外,还有其他原因,操作系统会尝试将活动或应用程序“冻结”,例如为了节省内存。在这种情况下,您的对象将会丢失。