DialogFragment上的commitAllowingStateLoss

时间:2015-05-24 13:57:32

标签: android android-fragments android-dialogfragment dialogfragment

我有一个.w-toplink { display: none; } 来展示IllegalStateException

DialogFragment

我知道为什么会发生这种情况,但我想通过重写DialogFragment java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState 函数来显示对话框 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 } mDismissed个变量,我如何访问这些变量来修改它们,就像父母一样。

3 个答案:

答案 0 :(得分:35)

我认为防止在IllegalStateException投掷DialogFragment可能更好用:

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

而不是在show()上使用DialogFragment

答案 1 :(得分:4)

如果您的DialogFragment没有要保存的状态,那么关于commitAllowingStateLoss的解决方案是有效的,否则它们会像告诉的函数名一样丢失。但我认为在大多数情况下我们都有保存状态,这是DialogFragment的主要好处:Android会重新创建它并自动维护其状态。

更好的解决方案是检查重新创建过程是否已完成,如果没有则返回调用者,调用者是Activity或FragmentActivity,它应该调用mark it并稍后再次调用show函数on on OnPostResume()或onResumeFragments()回调,我们可以确保重新创建所有片段。

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

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

答案 2 :(得分:2)

原始对话框片段

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 }

我不知道使用了mDismissedmShownByMe变量,所以如果重写DialogFragment的show(FagmentManager, String)方法更好,并且对我来说效果很好

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

isStateSaved可从appcompat> = 26.0.0或androidx

获得