How to properly retain a DialogFragment through rotation?

后端 未结 3 404
我寻月下人不归
我寻月下人不归 2020-12-02 07:32

I have a FragmentActivity that hosts a DialogFragment.

The DialogFragment perform network requests and handles Facebook authentication, so I need to retain it during

相关标签:
3条回答
  • 2020-12-02 07:43

    This is a convenience method using the fix from antonyt's answer:

    public class RetainableDialogFragment extends DialogFragment {
    
        public RetainableDialogFragment() {
            setRetainInstance(true);
        }
    
        @Override
        public void onDestroyView() {
            Dialog dialog = getDialog();
            // handles https://code.google.com/p/android/issues/detail?id=17423
            if (dialog != null && getRetainInstance()) {
                dialog.setDismissMessage(null);
            }
            super.onDestroyView();
        }
    }
    

    Just let your DialogFragment extend this class and everything will be fine. This becomes especially handy, if you have multiple DialogFragments in your project which all need this fix.

    0 讨论(0)
  • 2020-12-02 08:00

    Inside your DialogFragment, call Fragment.setRetainInstance(boolean) with the value true. You don't need to save the fragment manually, the framework already takes care of all of this. Calling this will prevent your fragment from being destroyed on rotation and your network requests will be unaffected.

    You may have to add this code to stop your dialog from being dismissed on rotation, due to a bug with the compatibility library:

    @Override
    public void onDestroyView() {
        Dialog dialog = getDialog();
        // handles https://code.google.com/p/android/issues/detail?id=17423
        if (dialog != null && getRetainInstance()) {
            dialog.setDismissMessage(null);
        }
        super.onDestroyView();
    }
    
    0 讨论(0)
  • 2020-12-02 08:00

    One of the advantages of using dialogFragment compared to just using alertDialogBuilder is exactly because dialogfragment can automatically recreate itself upon rotation without user intervention.

    However, when the dialogfragment does not recreate itself, it is possible that you overwrite onSaveInstanceState but didn't to call super:

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState); // <-- must call this if you want to retain dialogFragment upon rotation
        ...
    }
    
    0 讨论(0)
提交回复
热议问题