【问题标题】:OnRotate crash for DialogFragmentsDialogFragment 的 OnRotate 崩溃
【发布时间】:2013-11-03 18:28:28
【问题描述】:

我有一个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

知道我错过了什么吗?

【问题讨论】:

  • 不要将对话框添加到后台堆栈。只需调用 dialog.show(getSupportFragmentManager(), "dialog");
  • 如果我这样做,我会收到 java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState 错误。
  • 您何时何地调用 showDialog?
  • 我从后台运行的线程中调用它。
  • @Intern 如果您的对话框成功显示并且旋转后抛出异常,请参阅我的答案。顺便说一句,您只能显示来自 UI 线程的(对话框)片段。我猜你说的是 asyncTask 的 onPostExecute 方法,“我从后台运行的线程中调用它”。

标签: android android-dialogfragment illegalstateexception


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    试试这个:

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-05-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多