我在理解如何制作一个简单的DialogFragment来编辑一个(复杂的)对象(比如说一个人)时遇到一些麻烦,该对象具有名字和姓氏,以及每个由枚举(工作,家庭等)组成的电子邮件地址列表)和地址。

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

我还尝试在使用对话框的 Activity 中禁用配置更改,从而解决了该问题,但是我希望对话框可重用,并且要求使用它的所有 Activity 来禁用配置更改似乎是错误的。

第三种选择是将对Person的引用保存在一个静态变量中,但是再次,我希望对话框是可重用的并且能够支持多个实例。

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

最佳答案

嗯,有几种解决方案,如果您完全无法序列化您正在编辑的对象,则都不是理想的解决方案或故障保护解决方案。

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

但是,在大多数情况下都可以使用的简单解决方案是在DialogFragment上调用setRetainInstance(true)。这将防止您的 fragment 在配置更改时被破坏和重新创建。不过,在某些极端情况下,这可能行不通。除了配置更改外,还有其他原因,OS会尝试将 Activity 或应用“搁置”,例如以节省内存。在这种情况下,您的对象将丢失。

关于Android DialogFragment和配置更改,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8084871/

10-11 12:26