Android 警报对话框教程:使用时间选择器、日期选择器和列表对话框





5.00/5 (4投票s)
Android 警报对话框教程:使用时间选择器、日期选择器和列表对话框。在本教程中,我们将讨论如何在 Android 应用程序中使用对话框和警报。对话框是向用户显示的一个小型弹出窗口,用于获取用户的额外信息或要求用户做出决定。警报
在本教程中,我们将讨论如何在 Android 应用程序中使用对话框和警报。
对话框是向用户显示的一个小型弹出窗口,用于获取用户的额外信息或要求用户做出决定。Android 中的警报对话框可以用作确认警报,例如当用户删除某些内容时,如下图所示。
它还可以用于在 Android 应用程序中获取一些信息或在您的 Android 应用程序中创建自定义对话框。我们将讨论三个类:AlertDialog、DatePickerDialog 和 TimePickerDialog。所有这些类都扩展了基类 Dialog。
AlertDialog 可以显示标题、三个按钮、项目列表或任何自定义布局。

DatePickerDialog 和 TimePickerDialog 具有预定义的 UI,允许用户分别选择日期和时间。


我们将使用 DialogFragment 来创建对话框。DialogFragment 类提供了创建和管理 Dialog 对象所需的一切。
必备组件
- 我们希望您已安装 Android Studio。
- 另外,在学习本教程之前,我们建议您制作一个简单的 Hello World 应用程序并将其运行在您的智能手机上。
现在让我们创建我们的警报对话框应用程序。首先在 Android Studio 中创建一个新项目,如下所示。
创建新项目
请按照以下步骤操作
- 打开 Android Studio,然后通过转到文件 => 新建 => 新建项目来创建一个新项目。将应用程序名称输入为AlertDialog和您的公司域名。(我们使用了我们的公司域名,即 androidtutorialpoint.com。同样,您也可以使用您的域名)。
- 点击下一步并选择最低 SDK。我们保留了默认设置并点击下一步。
- 选择空活动并点击下一步。
- 在下一个屏幕中,将活动名称输入为 MainActivity,并记住勾选“生成布局”按钮,然后点击完成。
Gradle 将同步项目并解决所有依赖项。
带有一个按钮的警报对话框
创建一个新的 Java 类 SingleButtonFragment.java 并放入以下代码。
SingleButtonFragment.java
package com.androidtutorialpoint.alertdialog;
import android.app.Dialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.support.v4.app.DialogFragment;
import android.support.v7.app.AlertDialog;
import android.widget.Toast;
public class SingleButtonFragment extends DialogFragment {
    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
        builder.setMessage(R.string.dialog_single_button)
                .setPositiveButton(R.string.yes, new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int id) {
                        Toast.makeText(getActivity(),"You clicked yes",Toast.LENGTH_SHORT).show();
                    }
                });
        return builder.create();
    }
}
此类扩展了 DialogFragment。如上所述,它提供了管理 AlertDialog 的方法。onCreateDialog() 是一个回调方法,用于实例化并返回一个 Dialog 类对象。
AlertDialog.Builder 类允许您创建带有此类内容(包括自定义布局)的 AlertDialog。
在本教程中,我们将使用此类中的以下方法。
- setMessage()– 将给定的资源 ID 设置为向用户显示的消息。
- setPositiveButton()– 设置按下肯定按钮时调用的监听器。肯定按钮表示指向肯定响应的按钮,例如 - 确定或是按钮。
- setNegativeButton()– 设置按下否定按钮时调用的监听器。否定按钮表示指向否定响应的按钮,例如 - 取消或否按钮。
- setNeutralButton()– 设置按下中性按钮时调用的监听器。中性按钮表示指向中性响应的按钮,例如 - 稍后提醒我或不知道之类的响应。
在 SingleButtonFragment 中,我们只有一个肯定按钮,点击该按钮会显示一条肯定消息。请注意,当按钮被按下时,我们只是显示一条消息,通常您会根据按下的按钮执行一些操作。
带两个按钮的警报对话框
创建一个新的 Java 类 TwoButtonFragment.java 并放入以下代码。
TwoButtonFragment.java
package com.androidtutorialpoint.alertdialog;
import android.app.Dialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.support.v4.app.DialogFragment;
import android.support.v7.app.AlertDialog;
import android.widget.Toast;
public class TwoButtonFragment extends DialogFragment {
    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
        builder.setMessage(R.string.dialog_two_button)
                .setPositiveButton(R.string.yes, new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int id) {
                        Toast.makeText(getActivity(),"You clicked Yes !!",Toast.LENGTH_SHORT).show();
                    }
                })
                .setNegativeButton(R.string.no, new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int id) {
                        Toast.makeText(getActivity(),"You clicked No !!",Toast.LENGTH_SHORT).show();
                    }
                });
        return builder.create();
    }
}
此类的代码几乎与 SingleButtonFragment.java 类似,但是,我们添加了一个否定按钮以执行一些否定操作或显示否定消息。
单击肯定按钮时显示肯定消息,而单击否定按钮时显示否定消息。同样,我们只是出于演示目的显示消息,您可以根据按下的按钮执行一些操作。
带三个按钮的警报对话框
创建一个新的 Java 类 ThreeButtonFragment.java 并放入以下代码。
ThreeButtonFragment.java
package com.androidtutorialpoint.alertdialog;
import android.app.Dialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.support.v4.app.DialogFragment;
import android.support.v7.app.AlertDialog;
import android.widget.Toast;
public class ThreeButtonFragment extends DialogFragment {
    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
        builder.setMessage(R.string.dialog_three_button)
                .setPositiveButton(R.string.yes, new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int id) {
                        Toast.makeText(getActivity(),"You clicked Yes <img alt="🙂" class="wp-smiley" src="https://s.w.org/images/core/emoji/72x72/1f642.png" style="height: 1em; max-height: 1em;" /> !! \n You will Get Latest Updates ",Toast.LENGTH_SHORT).show();
                    }
                })
                .setNegativeButton(R.string.no, new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int id) {
                        Toast.makeText(getActivity(),"You clicked No <img alt="🙁" class="wp-smiley" src="https://s.w.org/images/core/emoji/72x72/1f641.png" style="height: 1em; max-height: 1em;" /> !! \n Please subscribe to Get Latest Updates ",Toast.LENGTH_SHORT).show();
                    }
                })
                .setNeutralButton(R.string.remind, new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        Toast.makeText(getActivity(),"You clicked Remind Me Later !! \n We will Remind you later ",Toast.LENGTH_SHORT).show();
                    }
                });
        return builder.create();
    }
}
这个类再次类似于 SingleButtonFragment.java,但是我们添加了一个否定按钮和一个中立按钮。
点击肯定按钮时显示肯定消息,而点击否定按钮时显示否定消息。此外,还有一个中性按钮可以给出中性响应。
带有单选列表的警报对话框
创建一个新的 Java 类 SingleChoiceListFragment.java 并放入以下代码。
SingleChoiceListFragment.java
package com.androidtutorialpoint.alertdialog;
import android.app.Dialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.support.v4.app.DialogFragment;
import android.support.v7.app.AlertDialog;
import android.widget.Toast;
public class SingleChoiceListFragment extends DialogFragment {
    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
        builder.setTitle(R.string.pick_dish)
                .setItems(R.array.dish_array, new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int which) {
                        // The 'which' argument contains the index position
                        // of the selected item
                        Toast.makeText(getActivity(), "You clicked " + getResources().getStringArray(R.array.dish_array)[which], Toast.LENGTH_SHORT).show();
                    }
                });
        return builder.create();
    }
}
在此类中,我们使用 setItems() 创建一个单选列表。这里只需要设置标题,而不是设置消息。为此,我们使用 setTitle() 函数。
在 setItems() 中,我们传递数组的资源 ID 并设置 OnClickListener() 方法,一旦用户点击其中一个选项,就会调用此监听器。点击项的索引存储在 int 参数 which 中。
在这里,我们通过使用数组中的索引 which 访问用户点击的元素来显示该元素。
getResources().getStringArray(R.array.dish_array)[which]
在 values 文件夹下创建一个资源文件 arrays.xml 并放入以下内容。
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string-array name="dish_array">
        <item>Pizza</item>
        <item>Pasta</item>
        <item>Sandwich</item>
    </string-array>
</resources>
带单选按钮列表的警报对话框
创建一个新的 Java 类 SingleChoiceRadioButtonListFragment.java 并放入以下代码。
SingleChoiceRadioButtonListFragment.java
package com.androidtutorialpoint.alertdialog;
import android.app.Dialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.support.v4.app.DialogFragment;
import android.support.v7.app.AlertDialog;
import android.widget.Toast;
public class SingleChoiceRadioButtonListFragment extends DialogFragment {
    private int mSelectedItem;
    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
        builder.setTitle(R.string.pick_dish)
                .setSingleChoiceItems(R.array.dish_array, 0,
                        new DialogInterface.OnClickListener(){
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                mSelectedItem = which;
                            }
                        })
                        // Set the action buttons
                .setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int id) {
                        Toast.makeText(getActivity(), "You selected !! \n " + getResources().getStringArray(R.array.dish_array)[mSelectedItem], Toast.LENGTH_SHORT).show();
                    }
                })
                .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int id) {
                Toast.makeText(getActivity(), "You clicked Cancel \n No Item was selected !!", Toast.LENGTH_SHORT).show();
            }
        });
        return builder.create();
    }
}
在此类中,我们使用 setSingleChoiceItems() 创建一个带有单选按钮的单选列表。第一个参数是数组资源,接下来是默认选中的项的位置,如果指定 -1 则不会选中任何项。第三个参数是 OnClickListener(),当用户点击该项时会调用它。这里我们只是将局部变量 mSelectedItem 设置为所选的索引。
我们添加了肯定按钮和否定按钮。点击肯定按钮时,会显示所选项目。点击取消按钮时,会显示一条吐司消息,表示未选择任何项目。
带有复选框多选列表的警报对话框
创建一个新的 Java 类 MultipleChoiceCheckBoxListFragment.java 并放入以下代码。
MultipleChoiceCheckBoxListFragment.java
package com.androidtutorialpoint.alertdialog;
import android.app.Dialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.support.v4.app.DialogFragment;
import android.support.v7.app.AlertDialog;
import android.widget.Toast;
import java.lang.reflect.Array;
import java.util.ArrayList;
public class MultipleChoiceCheckBoxListFragment extends DialogFragment {
    private ArrayList<Integer> mSelectedItems;
    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        mSelectedItems = new ArrayList();  // Where we track the selected items
        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
        // Set the dialog title
        builder.setTitle(R.string.pick_dish)
                // Specify the list array, the items to be selected by default (null for none),
                // and the listener through which to receive callbacks when items are selected
                .setMultiChoiceItems(R.array.dish_array, null,
                        new DialogInterface.OnMultiChoiceClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which,
                                                boolean isChecked) {
                                if (isChecked) {
                                    // If the user checked the item, add it to the selected items
                                    mSelectedItems.add(which);
                                } else if (mSelectedItems.contains(which)) {
                                    // Else, if the item is already in the array, remove it
                                    mSelectedItems.remove(Integer.valueOf(which));
                                }
                            }
                        })
                        // Set the action buttons
                .setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int id) {
                        // User clicked OK, so save the mSelectedItems results somewhere
                        // or return them to the component that opened the dialog
                        String s = "";
                        for(int i:mSelectedItems){
                            s += getResources().getStringArray(R.array.dish_array)[i];
                            s +="\n";
                        }
                        Toast.makeText(getActivity(), "You selected !! \n "+s, Toast.LENGTH_SHORT).show();
                    }
                })
                .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int id) {
                        Toast.makeText(getActivity(), "You clicked Cancel \n No Item was selected !!", Toast.LENGTH_SHORT).show();
                    }
                });
        return builder.create();
    }
}
在此类中,我们使用 setMultiChoiceItems() 创建带有复选框的多选列表。同样,第一个参数是数组资源,第二个参数指定默认选中的项,null 表示不选中所有复选框。第三个参数是 OnClickListener(),当用户点击该项时会调用它。我们将项添加到 Integer 类型的 ArrayList 中。
我们添加了肯定按钮和否定按钮。点击肯定按钮时,会显示所有选中的项目。点击取消按钮时,会显示一条吐司消息,表示未选择任何项目。
使用 DatePicker
日期选择器用于通过显示日历视图(如上面视频所示)允许用户选择日期(月、日、年)。日期选择器用于旅行应用程序中选择登机日期,在提醒应用程序中选择提醒日期以及许多其他应用程序中。
在本教程中,我们将在布局文件中使用 DatePicker 小部件,然后膨胀该视图以获取 DatePicker 对话框。
创建一个新的布局文件 dialog_date.xml 并添加以下代码。
dialog_date.xml
<DatePicker xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/dialog_date_date_picker"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
DatePickerFragment.java
package com.androidtutorialpoint.alertdialog;
import android.app.Dialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.support.v4.app.DialogFragment;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.DatePicker;
import java.util.Date;
import java.util.GregorianCalendar;
public class DatePickerFragment extends DialogFragment {
        private DatePicker datePicker;
        public interface DateDialogListener {
            void onFinishDialog(Date date);
        }
        @Override
        public Dialog onCreateDialog(Bundle savedInstanceState){
            View v = LayoutInflater.from(getActivity())
                    .inflate(R.layout.dialog_date,null);
            datePicker = (DatePicker) v.findViewById(R.id.dialog_date_date_picker);
            return new android.support.v7.app.AlertDialog.Builder(getActivity())
                    .setView(v)
                    .setTitle(R.string.date_picker_title)
                    .setPositiveButton(android.R.string.ok,
                            new DialogInterface.OnClickListener() {
                                @Override
                                public void onClick(DialogInterface dialog, int which) {
                                    int year = datePicker.getYear();
                                    int mon = datePicker.getMonth();
                                    int day = datePicker.getDayOfMonth();
                                    Date date = new GregorianCalendar(year,mon,day).getTime();
                                    DateDialogListener activity = (DateDialogListener) getActivity();
                                    activity.onFinishDialog(date);
                                    dismiss();
                                }
                            })
                    .create();
        }
}
首先,我们加载 dialog_date.xml。然后引用 datePicker。然后我们创建并返回一个向用户显示的 AlertDialog。我们使用 setView() 方法来设置加载的视图。当用户点击 DatePicker 对话框的“确定”按钮时
首先,我们从 datePicker 中选择年、月和日,然后我们创建一个日期对象并使用选择的值对其进行初始化。我们还将事件传递给宿主活动,在我们的例子中是 MainActivity。
为此,我们定义了一个接口 DateDialogListener,其中包含每种点击事件类型的方法。然后在将从对话框接收操作事件的宿主活动中实现该接口。
我们稍后在讨论 MainActivity 代码时会谈到实现 DateDialogListener。
使用 TimePicker
时间选择器用于通过显示时钟类型视图(如上面视频所示)允许用户选择时间(小时、分钟)。时间选择器主要用于闹钟或提醒应用程序中。
对于 TimePicker,我们也将使用布局文件中的 TimePicker 小部件,然后膨胀该视图以获取 TimePicker 对话框。
创建一个新的布局文件 dialog_time.xml 并添加以下代码。
dialog_time.xml
<TimePicker xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/dialog_time_picker"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>
TimePickerFragment.java
package com.androidtutorialpoint.alertdialog;
import android.app.Dialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.support.v4.app.DialogFragment;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.TimePicker;
public class TimePickerFragment extends DialogFragment  {
        private TimePicker timePicker;
        public interface TimeDialogListener {
            void onFinishDialog(String time);
        }
        @Override
        public Dialog onCreateDialog(Bundle savedInstanceState){
            View v = LayoutInflater.from(getActivity())
                    .inflate(R.layout.dialog_time,null);
            timePicker = (TimePicker) v.findViewById(R.id.dialog_time_picker);
            return new android.support.v7.app.AlertDialog.Builder(getActivity())
                    .setView(v)
                    .setTitle(R.string.time_picker_title)
                    .setPositiveButton(android.R.string.ok,
                            new DialogInterface.OnClickListener() {
                                @Override
                                public void onClick(DialogInterface dialog, int which) {
                                    int hour = 0;
                                    if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) {
                                        hour = timePicker.getHour();
                                    }else{
                                        hour = timePicker.getCurrentHour();
                                    }
                                    int minute = 0;
                                    if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) {
                                        minute = timePicker.getMinute();
                                    }else{
                                        minute = timePicker.getCurrentMinute();
                                    }
                                    TimeDialogListener activity = (TimeDialogListener) getActivity();
                                    activity.onFinishDialog(updateTime(hour,minute));
                                    dismiss();
                                }
                            })
                    .create();
        }
    private String updateTime(int hours, int mins) {
        String timeSet = "";
        if (hours > 12) {
            hours -= 12;
            timeSet = "PM";
        } else if (hours == 0) {
            hours += 12;
            timeSet = "AM";
        } else if (hours == 12)
            timeSet = "PM";
        else
            timeSet = "AM";
       String minutes = "";
        if (mins < 10)
            minutes = "0" + mins;
        else
            minutes = String.valueOf(mins);
        String myTime = new StringBuilder().append(hours).append(':')
                .append(minutes).append(" ").append(timeSet).toString();
        return myTime;
    }
}
首先,我们膨胀 dialog_time.xml。然后引用 timePicker。然后我们创建并返回一个 AlertDialog,它会显示给用户。我们使用了与 datePicker 方法中相同的 setView() 方法来设置膨胀的视图。当用户点击 TimePicker 对话框的确定按钮时,我们首先选择小时和分钟。为了选择小时,对于支持 Android API 23(Android Marshmallow)的手机,我们使用 timePicker.getHour(),对于早期版本,我们使用 timePicker.getCurrentHour()。然后我们根据小时和分钟的值创建一个字符串对象 myTime。我们还将事件传递给宿主活动,在我们的例子中是 MainActivity。
为此,我们定义了一个接口 TimeDialogListener,其中包含每种点击事件类型的方法。我们需要在将从对话框接收操作事件的宿主活动中实现此接口。
显示对话框
要显示对话框,我们创建一个 DialogFragment 实例并调用 show(),传入 FragmentManager 和对话框片段的标签名。
系统使用标签在必要时保存和恢复片段状态。它还允许我们通过使用 findFragmentByTag() 获取片段的句柄。
首先打开 MainActivity 的布局文件,即 activity_main.xml,并添加以下代码。
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity">
    <Button
        android:id="@+id/alert_dialog_one_button"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Alert Dialog with one button"
        android:padding="20dp"/>
    <Button
        android:id="@+id/alert_dialog_two_button"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Alert Dialog with two button"
        android:padding="20dp"/>
    <Button
        android:id="@+id/alert_dialog_three_button"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Alert Dialog with three button"
        android:padding="20dp"/>
    <Button
        android:id="@+id/alert_dialog_single_choice_list_button"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Single Choice Dialog"
        android:padding="20dp"/>
    <Button
        android:id="@+id/alert_dialog_single_choice_radio_button_list_button"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Single Choice Radio Button Dialog"
        android:padding="20dp"/>
    <Button
        android:id="@+id/alert_dialog_multiple_choice_check_box_list_button"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Multiple Choice Check Box Dialog"
        android:padding="20dp"/>
    <Button
        android:id="@+id/alert_dialog_date_picker"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Date Picker Dialog"
        android:padding="20dp"/>
    <Button
        android:id="@+id/alert_dialog_time_picker"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Time Picker Dialog"
        android:padding="20dp"/>
</LinearLayout>
我们创建了按钮来演示我们上面讨论的不同类型的 AlertDialogs。
打开文件 MainActivity.java 并添加以下代码。
MainActivity.java。
package com.androidtutorialpoint.alertdialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.support.v4.app.DialogFragment;
import android.support.v4.app.FragmentManager;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TimePicker;
import android.widget.Toast;
import java.text.SimpleDateFormat;
import java.util.Date;
public class MainActivity extends AppCompatActivity implements DatePickerFragment.DateDialogListener,TimePickerFragment.TimeDialogListener {
    private static final String DIALOG_DATE = "MainActivity.DateDialog";
    private static final String DIALOG_TIME = "MainActivity.TimeDialog";
    private static final String DIALOG_SINGLE_BUTTON = "MainActivity.SingleButtonDialog";
    private static final String DIALOG_TWO_BUTTON = "MainActivity.TwoButtonDialog";
    private static final String DIALOG_THREE_BUTTON = "MainActivity.ThreeButtonDialog";
    private static final String DIALOG_SINGLE_CHOICE_LIST = "MainActivity.SingleChoiceListDialog";
    private static final String DIALOG_SINGLE_CHOICE_RADIO_BUTTON_LIST = "MainActivity.SingleChoiceRadioButtonListDialog";
    private static final String DIALOG_MULTIPLE_CHOICE_CHECK_BOX_LIST = "MainActivity.MultipleChoiceCheckBoxListDialog";
    private Button singleButtonAlertDialog;
    private Button twoButtonAlertDialog;
    private Button threeButtonAlertDialog;
    private Button datePickerAlertDialog;
    private Button timePickerAlertDialog;
    private Button singleChoiceListAlertDialog;
    private Button singleChoiceRadioButtonAlertDialog;
    private Button multipleChoiceCheckBoxAlertDialog;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        singleButtonAlertDialog = (Button)findViewById(R.id.alert_dialog_one_button);
        twoButtonAlertDialog = (Button)findViewById(R.id.alert_dialog_two_button);
        threeButtonAlertDialog = (Button)findViewById(R.id.alert_dialog_three_button);
        datePickerAlertDialog = (Button)findViewById(R.id.alert_dialog_date_picker);
        timePickerAlertDialog = (Button)findViewById(R.id.alert_dialog_time_picker);
        singleChoiceListAlertDialog = (Button)findViewById(R.id.alert_dialog_single_choice_list_button);
        singleChoiceRadioButtonAlertDialog = (Button)findViewById(R.id.alert_dialog_single_choice_radio_button_list_button);
        multipleChoiceCheckBoxAlertDialog = (Button)findViewById(R.id.alert_dialog_multiple_choice_check_box_list_button);
        singleButtonAlertDialog.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                SingleButtonFragment dialog = new SingleButtonFragment();
                dialog.show(getSupportFragmentManager(), DIALOG_SINGLE_BUTTON);
            }
        });
        twoButtonAlertDialog.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                TwoButtonFragment dialog = new TwoButtonFragment();
                dialog.show(getSupportFragmentManager(), DIALOG_TWO_BUTTON);
            }
        });
        threeButtonAlertDialog.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                ThreeButtonFragment dialog = new ThreeButtonFragment();
                dialog.show(getSupportFragmentManager(), DIALOG_THREE_BUTTON);
            }
        });
        datePickerAlertDialog.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                DatePickerFragment dialog = new DatePickerFragment();
                dialog.show(getSupportFragmentManager(), DIALOG_DATE);
            }
        });
        timePickerAlertDialog.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                TimePickerFragment dialog = new TimePickerFragment();
                dialog.show(getSupportFragmentManager(), DIALOG_TIME);
            }
        });
        singleChoiceListAlertDialog.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                SingleChoiceListFragment dialog = new SingleChoiceListFragment();
                dialog.show(getSupportFragmentManager(), DIALOG_SINGLE_CHOICE_LIST);
            }
        });
        singleChoiceRadioButtonAlertDialog.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                SingleChoiceRadioButtonListFragment dialog = new SingleChoiceRadioButtonListFragment();
                dialog.show(getSupportFragmentManager(), DIALOG_SINGLE_CHOICE_RADIO_BUTTON_LIST);
            }
        });
        multipleChoiceCheckBoxAlertDialog.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                MultipleChoiceCheckBoxListFragment dialog = new MultipleChoiceCheckBoxListFragment();
                dialog.show(getSupportFragmentManager(), DIALOG_MULTIPLE_CHOICE_CHECK_BOX_LIST);
            }
        });
    }
    @Override
    public void onFinishDialog(Date date) {
        Toast.makeText(this, "Selected Date :"+ formatDate(date), Toast.LENGTH_SHORT).show();
    }
    public String formatDate(Date date) {
        SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
        String hireDate = sdf.format(date);
        return hireDate;
    }
    @Override
    public void onFinishDialog(String time) {
        Toast.makeText(this, "Selected Time : "+ time, Toast.LENGTH_SHORT).show();
    }
}
请注意,MainActivity 实现了我们在 datePickerFragment 和 timePickerFragment 中定义的接口 DatePickerFragment.DateDialogListener 和 TimePickerFragment.TimeDialogListener。
MainActivity 代码非常简单,我们首先为每种类型的 AlertDialog 定义了唯一的标签。接下来,我们引用布局中的按钮。在 OnClickListener() 中,我们正在显示 AlertDialog。
最后,我们有两个方法:onFinishDialog(Date date) 用于处理 datePicker 事件,onFinishDialog(String time) 用于处理 timePicker 事件。
在这些方法中,我们只是通过 toast 消息分别向用户显示日期和时间。
我们使用了以下字符串资源,打开您的 strings.xml 并放入以下字符串。
strings.xml
<resources>
    <string name="app_name">AlertDialog</string>
    <string name="date_picker_title">Select Date</string>
    <string name="cancel">Cancel</string>
    <string name="dialog_single_button">Isn\'t This Tutorial Great !!</string>
    <string name="no">No</string>
    <string name="yes">Yes</string>
    <string name="dialog_two_button">Are you a professional Android Developer ?</string>
    <string name="dialog_three_button">Did you subscribe to Android Tutorial Point ?</string>
    <string name="remind">Remind Me Later</string>
    <string name="pick_dish">What is  your favourite Dish ?</string>
    <string name="ok">OK</string>
    <string name="time_picker_title">Select Time</string>
</resources>
现在运行应用程序并尝试不同类型的 AlertDialogs。您还可以使用自定义布局来更精细地控制向用户显示的对话框,例如,您可以使用带有 EditText 的 Android 对话框来获取用户输入。


