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

r1k*_*1k0 15 android

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

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

谢谢,Mihai

ric*_*888 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;
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 通过在onCreate中放置setRetainInstance(true),在重新创建原始活动之后,将保留片段中声明的所有引用

    @Override
    public void onCreate(Bundle icicle) {
        this.setCancelable(true);
        setRetainInstance(true);
        super.onCreate(icicle);
    
    }
    
    Run Code Online (Sandbox Code Playgroud)
  3. 通过这样做避免轮换消失

    @Override
    public void onDestroyView() {
        if (getDialog() != null && getRetainInstance())
            getDialog().setDismissMessage(null);
        super.onDestroyView();
    
    Run Code Online (Sandbox Code Playgroud)

    }

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

    (MyModel) getArguments().getSerializable("MODEL")
    
    Run Code Online (Sandbox Code Playgroud)