DialogFragments的OnRotate崩溃

时间:2013-10-24 20:43:27

标签: android android-dialogfragment illegalstateexception

我有一个DialogFragment,它在后台线程的屏幕上显示。当我旋转屏幕时,我的应用程序崩溃了。以下是代码:

public void showDialog(DialogFragment dialog) {
  FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
  ft.addToBackStack(null);
  dialog.show(ft, "dialog");
} 

这给了我以下错误:

10-24 13:20:51.490: E/AndroidRuntime(3038): java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState

在SO和this文章上寻找答案后,我尝试这样做:

public void showDialog(DialogFragment dialog) {
  FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
  ft.addToBackStack(null);
  ft.add(dialog, "dialog");
  ft.commitAllowingStateLoss();
}

但有了这个,我在ft.commitAllowingStateLoss()

上收到以下错误
10-24 13:26:58.890: E/AndroidRuntime(3765): java.lang.IllegalStateException: Activity has been destroyed

知道我错过了什么吗?

3 个答案:

答案 0 :(得分:0)

试试这个:

FragmentManager fm = getActivity().getSupportFragmentManager();
dialog.setTargetFragment(this, 0);
dialog.show(fm, 0);

答案 1 :(得分:0)

你有一个方法showDialog(DialogFragment dialog),但你的问题出在你的dialogFragment的初始化中我猜。如果将dialogFragments初始化数据放入其参数,则问题将得到解决。编写newInstance方法并在创建对话框时使用它。请参阅示例here

编辑:您的例外原因是;你的活动以及dialogFragment被破坏并以某种方式重新创建(可能是通过未在清单中设置的config_changes或选择“设置 - >开发人员选项 - >不保持活动”。这可能发生,这是正常的)。对话框的初始化参数已丢失(变为空)。您必须将初始化参数放在dialogFragment的参数中,这样它就可以在创建后重新读取它们。

答案 2 :(得分:0)

您是否使用带参数的构造函数创建片段?如果是这样的话可能就是这种情况,因为你不应该以那种方式创建片段