Android对话框片段和配置更改

6
我有些困惑,不知道如何制作一个简单的DialogFragment来编辑一个复杂对象,比如一个人,包括名字、姓氏和一系列email地址(每个地址都由枚举值(工作,家庭等)和地址组成)。
首先,我应该如何正确地将Person对象传递给DialogFragment? 我目前的解决方案是创建一个setPerson(Person person)方法,在我的DialogFragment创建后但dialog.show()之前调用它。这种方法可以工作,但是当配置更改发生时(用户旋转屏幕),DialogFragment会重新创建,并且对于Person对象的引用为null。我知道可以使用onSaveInstanceState保存实例,但对象很复杂并且昂贵,这种方式保存大型对象似乎是浪费的。
我还尝试了在使用我的对话框的活动中禁用配置更改,这样就可以解决问题,但是我希望对话框是可重用的,要求所有使用它的活动禁用配置更改似乎是错误的。
第三个选项是将Person 的引用保存在静态变量中,但是再次强调,我希望对话框是可重用的,并且能够支持多个实例。
其他人是如何处理他们昂贵且复杂的对象以便在可重用的对话框中使用呢?
2个回答

3

有几个解决方案,但如果您完全无法序列化要编辑的对象,则没有一种是完美的或绝对可靠的。

我不建议使用android:configChanges="orientation",除非绝对、百分之百地避免不了。还有其他配置更改,如果您使用该解决方案,应用程序仍然会在其他更改时崩溃。

但在绝大多数情况下,一个简单的解决方案是在DialogFragment上调用setRetainInstance(true)。这将防止您的Fragment在配置更改时被销毁并重新创建。但是,也有一些极端情况下可能无效。除配置更改外,操作系统还有其他原因“冻结”应用程序或活动以便节省内存。在这种情况下,您的对象将会丢失。


1
将复杂对象传递给Fragment的最简洁方法是使该对象实现Parcelable接口,将对象添加到Bundle中,并使用fragment.setArguments(bundle)将bundle传递给Fragment。您可以通过调用getArguments()来在片段的onActivityCreated()中检索bundle来解压缩对象。
要在配置更改时保留参数,只需将“工作”Parcelable对象保存到片段的onSaveInstanceState(Bundle state)方法提供的bundle中,并在onActivityCreated()中稍后解压缩参数(如果savedInstanceState!= null)。
如果实现Parcelable会有明显的性能损失,或者您有某种类型的“活动”对象,则一种选择是创建一个非UI片段来保存数据对象。不涉及细节,您可以在非UI片段上设置setRetainInstance(true),并通过Activity中的接口协调与UI片段的连接。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接