DialogFragment 优于 AlertDialog [重复]

Posted

技术标签:

【中文标题】DialogFragment 优于 AlertDialog [重复]【英文标题】:DialogFragment advantages over AlertDialog [duplicate] 【发布时间】:2012-11-25 18:02:36 【问题描述】:

在开发 android 应用时,我读到建议使用 DialogFragment 而不是直接使用 AlertDialog 来显示警报和确认。

这是在例如 DialogFragment 的文档中完成的:http://developer.android.com/reference/android/app/DialogFragment.html

人们还说他们更喜欢这里: Android DialogFragment vs Dialog

我想知道这种方法的优点,因为代码变得更加复杂。

谢谢

【问题讨论】:

我认为除非有特定要求,否则您不应该使用对话框片段,它的编写时间很长,您已经在 alertdialog 中创建了一个视图,您可以根据需要自定义布局,无需调用 showDialog ()、onPrepareDialog() 和 onCreateDialog。 健壮的代码比更短的代码更重要 【参考方案1】:

这很简单。 DialogFragment 是一个片段。 那么片段可以为您提供什么,而其他对象却不能呢? 这是生命周期回调。 因此,使用 DialogFragment,它可以非常强大,并使您的代码更加简洁。 如果您在 Activity 被销毁时没有关闭对话框,您是否见过窗口泄漏?所以为了防止这种情况,你有没有试过在 onPause() 被调用时关闭对话框?因此,要做到这一点,您是否必须将该对话框引用到类级别对象? 有了 DialogFragment,一切都搞定了。 你会得到所有生命周期回调。 然后你可以为对话框提供更多的智能,让它自己做一些聪明的工作,而不是 Activity 告诉它做什么。

【讨论】:

【参考方案2】:

在 Dialog 上使用 DialogFragment:


自从引入 API 级别 13

Activity 中的showDialog 方法已弃用。 不建议在代码的其他地方调用对话框,因为您必须自己管理对话框(例如方向更改)。不使用 showDialog 会导致偶尔的异常,对话框没有链接到任何 Activity。

关于showDialog的注意事项:

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

DialogFragment 和 AlertDialog 的区别

阅读您的问题时想到的一件事。他们有那么大的不同吗? DialogFragment 与 Dialog 非常相似,只是包裹在一个片段中。来自有关 DialogFragment 的 Android 参考:

DialogFragment 是一个显示对话窗口的片段,浮动在其顶部 活动的窗口。这个片段包含一个 Dialog 对象,它 根据片段的状态适当显示。的控制 应该完成对话框(决定何时显示、隐藏、关闭它) 通过 API here,而不是直接调用对话框。

其他说明

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

【讨论】:

但是如果没有 showDialog,我们也可以通过在 alertDialog 中设置视图来显示对话框,我认为这很容易,我们需要更少的代码并且清晰。 方向改变时如何清晰? 好的,这是您的要求,请注意,使用不带 showDialog 的对话框会导致开发者控制台中偶尔出现异常报告。 (不由活动管理) 未附加到窗口的 IllegalStateException 视图是对话框抛出的典型异常。 IMO,答案的主要部分“没有区别/它们非常相似”并没有真正回答问题的标题“优势超过”。

以上是关于DialogFragment 优于 AlertDialog [重复]的主要内容,如果未能解决你的问题,请参考以下文章

DialogFragment: DialogFragment的一些理解

Activity与DialogFragment交互的方法

Dialogfragment 未清除

Android:DialogFragment.dismissInternal 处 DialogFragment.dismissAllow 处的 NullPointerException

DialogFragment.getDialog 返回 null

为啥要使用 DialogFragment?