65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIconstarIconstarIcon

5.00/5 (4投票s)

2016 年 7 月 18 日

CPOL

9分钟阅读

viewsIcon

35367

Android 警报对话框教程:使用时间选择器、日期选择器和列表对话框。在本教程中,我们将讨论如何在 Android 应用程序中使用对话框和警报。对话框是向用户显示的一个小型弹出窗口,用于获取用户的额外信息或要求用户做出决定。警报

在本教程中,我们将讨论如何在 Android 应用程序中使用对话框和警报。
对话框是向用户显示的一个小型弹出窗口,用于获取用户的额外信息或要求用户做出决定。Android 中的警报对话框可以用作确认警报,例如当用户删除某些内容时,如下图所示。

Delete Alert Dialog

它还可以用于在 Android 应用程序中获取一些信息或在您的 Android 应用程序中创建自定义对话框。我们将讨论三个类:AlertDialogDatePickerDialogTimePickerDialog。所有这些类都扩展了基类 Dialog

AlertDialog 可以显示标题、三个按钮、项目列表或任何自定义布局。
Android Dialog ListView Example

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


Android Date Picker ExampleAndroid Time Picker Example

我们将使用 DialogFragment 来创建对话框。DialogFragment 类提供了创建和管理 Dialog 对象所需的一切。

必备组件

  1. 我们希望您已安装 Android Studio。
  2. 另外,在学习本教程之前,我们建议您制作一个简单的 Hello World 应用程序并将其运行在您的智能手机上。

现在让我们创建我们的警报对话框应用程序。首先在 Android Studio 中创建一个新项目,如下所示。

创建新项目

请按照以下步骤操作

  1. 打开 Android Studio,然后通过转到文件 => 新建 => 新建项目来创建一个新项目。将应用程序名称输入为AlertDialog和您的公司域名。(我们使用了我们的公司域名,即 androidtutorialpoint.com。同样,您也可以使用您的域名)。
  2. 点击下一步并选择最低 SDK。我们保留了默认设置并点击下一步。
  3. 选择空活动并点击下一步。
  4. 在下一个屏幕中,将活动名称输入为 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。
在本教程中,我们将使用此类中的以下方法。

  1. setMessage() – 将给定的资源 ID 设置为向用户显示的消息。
  2. setPositiveButton() – 设置按下肯定按钮时调用的监听器。肯定按钮表示指向肯定响应的按钮,例如 - 确定或是按钮。
  3. setNegativeButton() – 设置按下否定按钮时调用的监听器。否定按钮表示指向否定响应的按钮,例如 - 取消或否按钮。
  4. 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 实现了我们在 datePickerFragmenttimePickerFragment 中定义的接口 DatePickerFragment.DateDialogListenerTimePickerFragment.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 对话框来获取用户输入。

© . All rights reserved.