AlertDialog与AlertDialog.Builder的区别

10

为什么要使用AlertDialog.Builder类而不是直接使用AlertDialog的可用方法,例如,为什么要使用AlertDialog.Builder.setCancellable而不是AlertDialog.setCancellable?这是否是一种冗余情况?

5个回答

10

AlertDialog 允许您在活动/片段上方显示一个对话框。通常用于提示用户进行交互,包括几个按钮或通知某些事情。

AlertDialog.Builder 是 AlertDialog 的内部静态类,它允许您使用其便捷的方法快速设置对话框。就像 AlertDialog 的帮助程序类一样,它用于在链式调用中调用方法。


但是它有什么帮助呢?它的目的只是将所有内容简洁地放在一个长语句中,而不是多个单独的语句(设置标题等),还是以某种方式提供更多功能? - stephenfin
@stephenfin 实际上不是这样的 - 构建器类不仅仅是用于链接方法调用。它们经常像工厂一样提供合理的默认值和自定义选项。此外,产品(AlertDialog)通常是不可变/抽象的,而工厂对应物则不是,这可以极大地简化创建产品的过程。例如,StringBuilderProcessBuilder - andr
@andr,你提到了不可变性这个很好的观点。如果你创建一个带有嵌入式WebView的AlertDialog,你会遇到这个问题(提示:如果你想看到加载的URL的更改,请使用AlertDialog.Builder)。 - Cesar Maiorino

8
由于 AlertDialog.setCancellable 返回 void,而 AlertDialog.Builder.setCancellable 返回一个 AlertDialog.Builder
这意味着该构造器允许您以较少的冗长链式设置一组设置。它只是一个便利类。

1
所以这有点类似于C++中的istream/ostream运算符?听起来很合理。 - stephenfin

1
AlertDialog.Builder用于设置属性,例如setTitle()setMessage(),但这些属性不会显示给用户。 AlertDialog则是用于显示在AlertDialog.Builder中设置的属性。
之所以同时存在这两个类,是为了方便地将设置和显示分开处理。

0

我认为工厂方法更加方便。


0
在 jqpublic 的回答基础上,建造者模式不仅仅是一种方便,它还可以确保对话框不会处于意外或不适当的状态。通常情况下,建造者模式可以让你收集所需的所有代码,然后在准备好时才实例化对象。

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