DialogFragment上的commitAllowingStateLoss

Ara*_* GM 26 android android-fragments android-dialogfragment dialogfragment

我有一个IllegalStateException展示DialogFragment:

java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
Run Code Online (Sandbox Code Playgroud)

我知道它为什么会发生但我想通过重写DialogFragment 函数使用commitAllowingStateLoss来显示对话框show:

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
}
Run Code Online (Sandbox Code Playgroud)

但我不访问mDismissedmShownByMe变量,我如何访问这些变量来修改它们,就像它的父母一样.

Ara*_* GM 40

我想,以防止扔IllegalStateExceptionDialogFragment可能会更好的使用方法:

 YourDialogFragment dialogFragment = new YourDialogFragment();
 fragmentManager.beginTransaction().add(dialogFragment, YourDialogFragment.TAG_FRAGMENT).commitAllowingStateLoss();
Run Code Online (Sandbox Code Playgroud)

而不是使用show()DialogFragment.

  • 但是,内部标志更改(` mDismissed = false;` 和 `mShownByMe = true;`)不会更新吗? (5认同)

vuh*_*990 7

原点对话框片段

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
}
Run Code Online (Sandbox Code Playgroud)

我不知道mDismissedmShownByMe变量用于,所以如果覆盖show(FragmentManager, String)DialogFragment 方法应该更好,它对我来说很好用

override fun show(manager: FragmentManager?, tag: String?) {
    if (manager?.isDestroyed == false && !manager.isStateSaved) {
      super.show(manager, tag)
    }
  }
Run Code Online (Sandbox Code Playgroud)

isStateSaved 可从 appcompat >= 26.0.0 或 androidx


cn1*_*23h 6

如果您的DialogFragment没有要保存的状态,则有关commitAllowingStateLoss的解决方案将起作用,否则它们将像函数名一样丢失。但是我认为在大多数情况下,我们需要保存状态,这就是DialogFragment的主要优点:Android重新创建它并自动维护其状态。

更好的解决方案是检查重新创建过程是否完成,如果没有完成,则返回到调用者(Activity或FragmentActivity),它应该对其进行标记并稍后在其onPostResume()或onResumeFragments()中再次调用show函数。回调,我们可以确保重新创建所有片段。

这是DialogFragment子类的重写show():

public boolean show(FragmentManager fragmentManager) {
   if (fragmentManager.isStateSaved()) return false;
   show(fragmentManager, tagName);
   return true;
}
Run Code Online (Sandbox Code Playgroud)