commitAllowingStateLoss на DialogFragment
У меня есть IllegalStateException
при показе DialogFragment
:
java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
я знаю, почему это происходит, но я хочу использовать commitAllowingStateLoss при отображении диалога, переопределяя функцию show
DialogFragment:
public void show(FragmentManager manager, String tag) {
mDismissed = false;
mShownByMe = true;
FragmentTransaction ft = manager.beginTransaction();
ft.add(this, tag);
ft.commit(); //replace it by commitAllowingStateLoss
}
но я не mDismissed
доступа к переменным mDismissed
и mShownByMe
, как я могу получить доступ к этим переменным, чтобы изменить их, как это сделал родитель.
Ответы
Ответ 1
Я думаю, что для предотвращения выброса IllegalStateException
на DialogFragment
может быть лучше использовать:
YourDialogFragment dialogFragment = new YourDialogFragment();
fragmentManager.beginTransaction().add(dialogFragment, YourDialogFragment.TAG_FRAGMENT).commitAllowingStateLoss();
вместо использования show()
на DialogFragment
.
Ответ 2
Решение о commitAllowingStateLoss работает, если ваш DialogFragment не имеет состояния для сохранения, иначе они будут потеряны, как указано в названии функции. Но я думаю, что в большинстве случаев у нас есть состояние для сохранения, это главное преимущество DialogFragment: Android воссоздает его и автоматически сохраняет свое состояние.
Лучшим решением было бы проверить, завершен ли процесс повторного создания, а затем не возвратится к вызывающему, либо Activity или FragmentActivity, он должен вызвать его и снова вызвать функцию show позже в своих onPostResume() или onResumeFragments() обратный вызов, который позволяет убедиться, что все фрагменты воссозданы.
Вот переопределенное show() из подкласса DialogFragment:
public boolean show(FragmentManager fragmentManager) {
if (fragmentManager.isStateSaved()) return false;
show(fragmentManager, tagName);
return true;
}
Ответ 3
Фрагмент исходного диалога
public void show(FragmentManager manager, String tag) {
mDismissed = false;
mShownByMe = true;
FragmentTransaction ft = manager.beginTransaction();
ft.add(this, tag);
ft.commit(); //replace it by commitAllowingStateLoss
}
Я не знаю, mDismissed
, mShownByMe
переменные, используемые для, так должно быть лучше, если переопределение show(FragmentManager, String)
метод DialogFragment и она отлично работает со мной
override fun show(manager: FragmentManager?, tag: String?) {
if (manager?.isDestroyed == false && !manager.isStateSaved) {
super.show(manager, tag)
}
}
isStateSaved
доступно из appcompat> = 26.0.0 или androidx