我有一个关于DialogFragment的问题。我正在尝试创建一个对话框,在设备旋转后保持状态。这个对话框有一堆对诸如适配器和其他较重对象之类的东西的引用,我需要在旋转时保留它,如果可能的话,不必为每个引用Parcelable或Serializable,以便我使用onSaveInstanceState来保存和恢复它们重新创建原始活动。
我注意到DialogFragment上有一个名为setRetainInstance(boolean)的方法,它允许您在重新创建活动时保留对话框片段实例。但是,当我现在旋转设备时,对话框不再显示。我知道我可以从活动的FragmentManager中获取它,但我找不到让它再次可见的方法。对此有何建议?
谢谢, 米哈伊
答案 0 :(得分:23)
您需要做的事情很少:
使用实例工厂方法启动DialogFragment实例,如下所示:
public static MyDialogFragment newInstance(MyModel model) {
MyDialogFragment myDialogFragment = new MyDialogFragment();
Bundle bundle = new Bundle();
bundle.putSerializable("MODEL", model);
myDialogFragment .setArguments(bundle);
return myDialogFragment;
}
通过在onCreate中放置setRetainInstance(true),在重新创建原始活动之后,将保留片段中声明的所有引用
@Override
public void onCreate(Bundle icicle) {
this.setCancelable(true);
setRetainInstance(true);
super.onCreate(icicle);
}
通过这样做避免轮换消失
@Override
public void onDestroyView() {
if (getDialog() != null && getRetainInstance())
getDialog().setDismissMessage(null);
super.onDestroyView();
}
使用
获取您的对象(MyModel) getArguments().getSerializable("MODEL")
答案 1 :(得分:0)
只要执行以下操作,就应自动保留对话框片段:
setRetainInstance
,则需要手动存储值。否则,在大多数情况下,你应该不用担心它。如果你做的事情有点复杂,你可能需要setRetainInstance(true)
,否则忽略它。