How to properly retain a DialogFragment through rotation?
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();
}
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.
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
...
}