对话框

尝试使用 Compose 方式
Jetpack Compose 是推荐用于 Android 的界面工具包。了解如何在 Compose 中添加组件。

对话框是一种小窗口,用于提示用户做出决定或输入更多信息。 对话框不会占据整个屏幕,通常适用于需要用户进行操作才能继续执行的模态框事件。

一张显示基本对话框的图片
图 1.基本对话框。

Dialog 类是对话框的基类,但请勿直接实例化 Dialog 。而是应使用下列子类之一:

AlertDialog
此对话框可显示标题、按钮(最多三个)、选项 列表或自定义布局。
DatePickerDialogTimePickerDialog
此对话框带有允许用户选择日期或 时间。

这些类可定义对话框的样式和结构。您还需要使用 DialogFragment 作为对话框的容器。DialogFragment 类提供 创建对话框和管理其外观所需的所有控件, 而非调用 Dialog 对象上的方法。

使用 DialogFragment 来管理对话框可确保对话框能正确处理各种生命周期事件,如用户点按“返回”按钮或旋转屏幕时。此外,DialogFragment 类还允许您以可嵌入组件的形式在较大界面中重复使用对话框界面,类似于传统的Fragment(例如当您想让对话框界面在大屏幕和小屏幕上具有不同外观时)。

本文档的以下部分介绍了如何将 DialogFragmentAlertDialog 对象结合使用。如果您想创建日期或时间选择器,请阅读 向应用添加选择器

创建对话框 fragment

通过扩展 DialogFragment 并在 onCreateDialog() 回调方法中创建 AlertDialog,您可以完成各种对话框设计,包括自定义 布局以及 Material Design Dialogs中描述的布局。

例如,以下是一个在 DialogFragment 中管理的基本 AlertDialog

Kotlin

class StartGameDialogFragment : DialogFragment() {
    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
        return activity?.let {
            // Use the Builder class for convenient dialog construction.
            val builder = AlertDialog.Builder(it)
            builder.setMessage("Start game")
                .setPositiveButton("Start") { dialog, id ->
                    // START THE GAME!
                }
                .setNegativeButton("Cancel") { dialog, id ->
                    // User cancelled the dialog.
                }
            // Create the AlertDialog object and return it.
            builder.create()
        } ?: throw IllegalStateException("Activity cannot be null")
    }
}

class OldXmlActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_old_xml)

        StartGameDialogFragment().show(supportFragmentManager, "GAME_DIALOG")
    }
}

Java

public class StartGameDialogFragment extends DialogFragment {
    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        // Use the Builder class for convenient dialog construction.
        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
        builder.setMessage(R.string.dialog_start_game)
               .setPositiveButton(R.string.start, new DialogInterface.OnClickListener() {
                   public void onClick(DialogInterface dialog, int id) {
                       // START THE GAME!
                   }
               })
               .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
                   public void onClick(DialogInterface dialog, int id) {
                       // User cancels the dialog.
                   }
               });
        // Create the AlertDialog object and return it.
        return builder.create();
    }
}
// ...

StartGameDialogFragment().show(supportFragmentManager, "GAME_DIALOG");

当您创建此类的实例并对该对象调用 show() 时,对话框将如下图所示。

一张图片,显示了一个包含两个操作按钮的基本对话框
图 2.包含一条消息和两个 操作按钮的对话框。

下一部分将详细介绍如何使用 AlertDialog.Builder API 来创建对话框。

根据对话框的复杂度,您可以在 DialogFragment 中实现各种其他回调方法,包括所有基本的 fragment lifecycle methods

构建提醒对话框

您可以使用 AlertDialog 类来构建各种对话框设计。通常情况下,该类是您完成构建所需的唯一对话框类。如图所示,提醒对话框有三个区域:

  • 标题:此为可选项,仅当内容区域被 详细消息、列表或自定义布局占据时才应使用标题。如果需要陈述的是一条简单消息或问题,则不需要标题。
  • 内容区域:内容区域可显示消息、列表或其他自定义 布局。
  • 操作按钮:对话框中最多可以有三个操作按钮。

AlertDialog.Builder 类提供了 API,可让您创建含有这几种内容(包括自定义 布局)的 AlertDialog

如需构建 AlertDialog,请执行以下操作:

Kotlin

val builder: AlertDialog.Builder = AlertDialog.Builder(context)
builder
    .setMessage("I am the message")
    .setTitle("I am the title")

val dialog: AlertDialog = builder.create()
dialog.show()

Java

// 1. Instantiate an AlertDialog.Builder with its constructor.
AlertDialog.Builder