旋转设备后,不会显示带有setRetainInstanceState(true)的DialogFragment

时间:2012-12-18 14:20:48

标签: android

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

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

谢谢, 米哈伊

2 个答案:

答案 0 :(得分:23)

您需要做的事情很少:

  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. 通过在onCreate中放置setRetainInstance(true),在重新创建原始活动之后,将保留片段中声明的所有引用

    @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")
    

答案 1 :(得分:0)

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

  1. 如果您调用Activity onSaveInstanceState(),请确保调用超级函数!!!! 。就我而言,这是关键。还要确保你在Fragment中做同样的事情。
  2. 如果您使用setRetainInstance,则需要手动存储值。否则,在大多数情况下,你应该不用担心它。如果你做的事情有点复杂,你可能需要setRetainInstance(true),否则忽略它。
  3. 有些人抱怨支持库中存在一个错误,其中不应该发送解雇消息。最新的支持库似乎已经修复了,因此您不必担心这一点。