15

我有一个关于 DialogFragment 的问题。我正在尝试制作一个对话框,在设备旋转后保持其状态。这个对话框有一堆对诸如适配器和其他较重对象之类的东西的引用,我需要在旋转时保持它,如果可能的话,不必将每个引用都设为 Parcelable 或 Serializable 以便我使用 onSaveInstanceState 来保存和恢复它们重新创建原始活动。

我注意到 DialogFragment 上有一个名为 setRetainInstance(boolean) 的方法,它允许您在重新创建活动时保留对话框片段实例。但是,当我现在旋转设备时,对话框不再显示。我知道我可以从活动的 FragmentManager 中获取它,但我找不到让它再次可见的方法。对此有何建议?

谢谢,米海

4

2 回答 2

24

您需要做的事情很少:

  1. 使用实例工厂方法来启动 DialogFragment 实例,如下所示:

    public static MyDialogFragment newInstance(MyModel model) {
        MyDialogFragment myDialogFragment = new MyDialogFragment();
        Bundle bundle = new Bundle();
        bundle.putSerializable("MODEL", model);
        myDialogFragment .setArguments(bundle);
        return myDialogFragment;
    }
    
  2. 通过将 setRetainInstance(true) 放在 onCreate 中,在重新创建原始活动后,将保留在片段中声明的所有引用

    @Override
    public void onCreate(Bundle icicle) {
        this.setCancelable(true);
        setRetainInstance(true);
        super.onCreate(icicle);
    
    }
    
  3. 通过这样做避免旋转消失

    @Override
    public void onDestroyView() {
        if (getDialog() != null && getRetainInstance())
            getDialog().setDismissMessage(null);
        super.onDestroyView();
    

    }

  4. 通过使用获取您的对象

    (MyModel) getArguments().getSerializable("MODEL")
    
于 2012-12-24T02:14:00.123 回答
0

只要您执行以下操作,就应该自动保留对话框片段:

  1. 如果您调用 Activity onSaveInstanceState(),请确保调用超级函数!!!!. 就我而言,这是关键。还要确保你在 Fragment 中做同样的事情。
  2. 如果使用setRetainInstance,则需要手动存储值。否则,在大多数情况下,您应该不必担心。如果你正在做一些更复杂的事情,你可能需要setRetainInstance(true),否则忽略它。
  3. 有些人抱怨支持库中的一个错误,即在不应该发送关闭消息时发送。最新的支持库似乎已经解决了这个问题,所以你不必担心这个问题。
于 2013-12-31T11:21:48.387 回答