我有一个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
知道我错过了什么吗?
答案 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)
您是否使用带参数的构造函数创建片段?如果是这样的话可能就是这种情况,因为你不应该以那种方式创建片段