1

我有一个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 和这篇文章的答案后,我尝试这样做:

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

知道我错过了什么吗?

4

3 回答 3

0

你有一个方法,showDialog(DialogFragment dialog)但我猜你的问题出在你的对话框片段的初始化中。如果你把 dialogFragments 初始化数据放到它的参数中,你的问题就迎刃而解了。编写一个 newInstance 方法并在创建对话框时使用它。在此处查看示例。

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

于 2013-10-24T21:26:32.837 回答
0

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

于 2013-10-25T17:34:40.983 回答
0

尝试这个:

FragmentManager fm = getActivity().getSupportFragmentManager();
dialog.setTargetFragment(this, 0);
dialog.show(fm, 0);
于 2013-10-24T21:19:14.167 回答