【问题标题】:How to safely dismiss DialogFragment in onstop()?如何在 onstop() 中安全地关闭 DialogFragment?
【发布时间】:2013-05-30 17:07:46
【问题描述】:

我需要在 FragmentActivity 的 onStop() 中关闭 DialogFragment 如果它正在显示,这就是我所做的

if(mAlertDlg != null && mAlertDlg.getDialog() != null)
    mAlertDlg.dismiss();

但我通常会得到 IllegalStateException。所以请告诉我为什么该代码是错误的,以及在 onStop() 中关闭 DialogFragment 的正确方法是什么?谢谢。

【问题讨论】:

  • 有关此主题的更多信息,请参阅blog post。一般来说,您不想使用*****AllowingStateLoss() 方法来解决此类问题。 IllegalStateException 被抛出,因为会发生状态丢失。使用这些方法只是为了避免异常......但状态丢失仍然可能导致您的应用程序出现错误。
  • 感谢您的精彩文章,但在我的场景中,当 Activity 不再处于前台时,我仍然可以找到比使用 *AllowingStateLoss() 方法关闭对话框更好的方法。在 onPause() 和 onStop() 上不能 dismiss() 怎么办?
  • 当 Activity 进入后台和/或完成时,FragmentManager 将自动关闭对话框。我不明白为什么有必要在 onStop() 中关闭对话框...到那时,FragmentManager 已经保存了其 Fragments 的状态并将其全部记录为 Activity 状态的一部分,因此关闭调用将有没有效果。无论哪种方式,对话框和片段都不能跨多个 Activity 实例持续存在......一旦 Activity 停止/销毁,它们将从 Activity 的窗口中删除。

标签: android android-dialogfragment dialogfragment


【解决方案1】:

您应该使用dialogFragment.dismissAllowingStateLoss()。正如commitAllowingStateLoss() 的文档所说:

"类似于 commit(),但允许提交在一个 活动的状态被保存。这很危险,因为提交可能是 如果活动需要稍后从其状态恢复,则丢失,因此 这应该只用于 UI 状态可以的情况 对用户进行意外更改。”

所以对于dismissAllowingStateLoss() 是相同的方法。

【讨论】:

  • 您也可以查看此post,了解有关commitAllowingStateLoss()dismissAllowingStateLoss() 的更多信息。
【解决方案2】:

如果您想在onStop() 中取消DialogFragment,您可能不想使用DialogFragment,而是使用经典的Dialog

DialogFragment之所以存在,是为了让Activity重新创建的时候能够自动恢复一个对话框。如果您在onStop() 中关闭它,它将永远无法恢复。

另外,如果你使用dismissAllowingStateLoss(),那么在onSaveInstanceState()中可能无法正确记录dismiss事务(顾名思义,可能会发生状态丢失),这将导致在activity被恢复时对话框被恢复。重新创建,显然这不是你想要的。

【讨论】:

    【解决方案3】:

    尝试使用dismissAllowingStateLoss() 而不是dismiss()

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-05-01
      • 1970-01-01
      • 2023-03-05
      • 2014-01-11
      • 1970-01-01
      • 2018-05-11
      • 2011-04-15
      相关资源
      最近更新 更多