DialogFragment相较于AlertDialog的优势

73

我认为除非有特定的要求,否则不应该使用DialogFragment,因为它需要编写大量代码。你可以在AlertDialog中创建一个视图,并根据需要自定义布局,无需调用showDialog()、onPrepareDialog()和onCreateDialog()。 - Abhijit Chakra
健壮的代码比短小的代码更重要。 - Tobrun
2个回答

68

这很简单。
DialogFragment是一个片段。 那么相对于其他对象,片段能为您提供什么呢?
它是生命周期回调。
因此,使用DialogFragment可以变得非常强大,并使您的代码更加清晰。
如果Activity在销毁时您没有关闭对话框,您是否曾经看到窗口泄漏?为了防止这种情况,您是否曾经尝试在onPause()被调用时关闭对话框?为了做到这一点,您是否曾经不得不将该对话框的引用制作成一个类级别的对象?
通过DialogFragment,这些都处理好了。
并且您获得了所有生命周期回调。
然后,您可以为对话框提供更多智能化功能,使其自己完成一些智能工作,而不是由Activity告诉它该做什么。


63

使用DialogFragment而不是Dialog:


  • 自API 13引入以来

    Activity的showDialog方法已过时。在代码的其他位置调用对话框并不明智,因为您将不得不自己管理对话框(例如方向更改)。不使用showDialog会导致偶尔出现异常,因为该对话框与任何Activity都没有关联。

    关于showDialog的说明:

    Dialog的参考:Activity提供了一种管理对话框创建、保存和恢复的方法。请参见onCreateDialog(int)、onPrepareDialog(int, Dialog)、showDialog(int)和dismissDialog(int)。如果使用了这些方法,则getOwnerActivity()将返回管理此对话框的Activity。

  • DialogFragment和AlertDialog之间的区别

    阅读您的问题时,有一件事情让人想到。它们有很大的不同吗? DialogFragment与Dialog非常相似,只是包装在一个片段中。从Android参考中了解DialogFragment:

    DialogFragment是显示在其Activity窗口上方的对话框窗口的片段。此片段包含一个Dialog对象,它根据片段的状态适当地显示。控制对话框(决定何时显示、隐藏、解除)应通过此处的API而不是直接调用对话框来完成。

  • 其他注意事项

    • 由于具有不同屏幕尺寸的设备的多样性,片段是Android框架的自然演变。
    • DialogFragments和Fragments可在支持库中使用,使该类可在所有当前使用的Android版本中使用。

1
当方向改变时,这个清晰吗? - Tobrun
一个 IllegalStateException 视图未附加到窗口是对话框抛出的典型异常。 - Tobrun
我从未表示这会提高性能。我想表明一个对话框应该附加到某个东西上。以前使用showDialog方法将其附加到活动上。但自从引入片段以来,对话框应该附加到片段而不是活动上。不将其附加到任何东西上会使其容易出现错误。 - Tobrun
但是我在活动中使用showDialog()的经验是无用的,而且它会增加代码行数。例如,如果我使用showDialog()在对话框中显示当前时间和日期在edittext字段中,假设当我按下按钮时首次显示对话框,它将给我当前日期和时间,如果我第二次按下它,它不会更新当前日期和时间,我必须在onPrepareDialog()中更新它,这会导致我的代码复杂化并增加代码行数。对于这些情况,我想说的是,showDialog()绝对不是必需的。 - Abhijit Chakra
8
IMO,“没有差别/它们非常相似”这个回答的主要部分并没有真正回答问题标题“优势是什么”。 - kizzx2
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接