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