在DialogFragment上commitAllowingStateLoss

我有一个IllegalStateException显示一个DialogFragment

 java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState 

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

 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 } 

但我不访问mDismissedmShownByMevariables,我怎样才能访问这些variables来修改它们,因为它是父母做的。

Solutions Collecting From Web of "在DialogFragment上commitAllowingStateLoss"

我认为,以防止抛出DialogFragment IllegalStateException可能会更好地使用:

  YourDialogFragment dialogFragment = new YourDialogFragment (); fragmentManager.beginTransaction().add(dialogFragment, YourDialogFragment .TAG_FRAGMENT).commitAllowingStateLoss(); 

而不是在DialogFragment上使用show()

关于commitAllowingStateLoss的解决scheme,如果你的DialogFragment没有保存的状态,那么解决scheme就会起作用,否则它们会像函数名字一样丢失。 但我认为在大多数情况下,我们有状态保存,这是DialogFragment的主要好处:Android重新创build并自动保持其状态。

更好的解决scheme是检查重新创build的过程是否完成,如果不是,则返回到调用者(Activity或FragmentActivity),它应该调用mark并在onPostResume()或onResumeFragments()中再次调用show函数。callback,我们可以确保所有片段被重新创build。

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

 public boolean show(FragmentManager fragmentManager) { if (fragmentManager.isStateSaved()) return false; show(fragmentManager, tagName); return true; }