我在理解如何编写一个简单的DialogFragment来编辑一个(复杂的)对象时遇到一些麻烦,比如一个Person,它有名字和姓氏,还有一个电子邮件地址列表,每个地址都包含一个枚举(Work,家等,以及地址。
首先,如何将Person对象正确传递给DialogFragment?我当前的解决方案有一个setPerson(Person person)方法,在我创建DialogFragment之后但在dialog.show()之前调用。这可以正常工作,直到配置发生变化(用户旋转屏幕)。重新创建DialogFragment,并且对Person对象的引用为null。我知道我可以使用onSaveInstanceState保存实例,但是对象既复杂又昂贵,并且以这种方式持久化大对象似乎很浪费。
我也尝试在使用我的对话框的活动中禁用配置更改,并修复了问题,但我希望对话框可以重复使用,并且要求所有使用它来禁用配置更改的活动似乎都是错误的。
第三个选项是将对Person的引用保存在静态变量中,但同样,我希望对话框可以重用并且能够支持多个实例。
其他人如何在可重复使用的对话框中处理昂贵且复杂的对象?
答案 0 :(得分:2)
嗯,有几个解决方案,如果你完全无法序列化你正在编辑的对象,那么这些解决方案都不是很棒或安全。
我不建议永远使用android:configChanges="orientation"
,除非绝对是100%不可避免的。还有其他配置更改,如果您使用该解决方案,您的应用仍将与其他应用分开。
但是,在绝大多数情况下都能使用的简单解决方案是在DialogFragment上调用setRetainInstance(true)
。这将防止您的Fragment在配置更改时被销毁和重新创建。但是有一个边缘情况,这可能不起作用。除了配置更改之外还有其他原因,操作系统会尝试将活动或应用程序置于“冰上”,例如以节省内存。在这种情况下,您的对象将丢失。
答案 1 :(得分:1)
将复杂Object传递给片段的最简洁方法是使Object实现Parcelable
,将对象添加到Bundle
,然后将包传递给Fragment
{ {1}}。您可以通过调用fragment.setArguments(bundle)
来检索包,从而在片段的onActivityCreated()
中解压缩对象。
要在配置更改中保留参数,只需将“working”parcelable对象保存到片段的getArguments()
方法提供的包中,稍后在onSaveInstanceState(Bundle state)
中解压缩参数{{1} }。
如果实现onActivityCreated()
会有明显的性能影响,或者您有某种类型的“实时”对象,则可以选择创建一个非UI片段来保存数据对象。在不了解详细信息的情况下,您可以在非UI片段上savedInstanceState !=null
,并通过Parcelable
中的接口协调与UI片段的连接。