Android 以可直接使用的对话框形式提供可供用户选择时间或日期的控件。 每个选择器都提供一些控件,以用于选择时间的各个部分(小时、分钟、上午/下午)或日期的各个部分(月、日、年)。使用这些选择器有助于确保用户可以选择格式正确且已根据用户所在的语言区域进行调整的有效时间或日期。

建议您使用 DialogFragment
托管每个时间或日期选择器。DialogFragment
负责管理对话框生命周期,并可让您以不同的布局配置显示选择器,例如在手机上显示为基本对话框,或在大屏幕上显示为布局的嵌入部分。
尽管 DialogFragment
最初是在 Android 3.0(API 级别 11)平台中添加的,但如果您的应用支持 Android 3.0 之前的版本,甚至低至 Android 1.6,您仍可以使用支持库中提供的 DialogFragment
类来确保向后兼容性。
注意:以下代码示例显示了如何使用适用于 DialogFragment
的支持库 API 为时间选择器和日期选择器创建对话框。如果您的应用的 minSdkVersion
为 11 或更高,您可以改用 DialogFragment
的平台版本。
关键类如下:
另请参阅 Fragment 概览。
创建时间选择器
要使用 DialogFragment
显示 TimePickerDialog
,您需要定义一个 Fragment 类,用于扩展 DialogFragment
并从 Fragment 的 onCreateDialog()
方法返回 TimePickerDialog
。
注意:如果您的应用支持 Android 3.0 之前的版本,请务必使用支持库来设置您的 Android 项目,如设置项目以使用库中所述。
扩展时间选择器的 DialogFragment
要为 TimePickerDialog
定义 DialogFragment
,您必须执行以下操作:
- 定义
onCreateDialog()
方法,以返回TimePickerDialog
的实例 - 实现
TimePickerDialog.OnTimeSetListener
接口,以在用户设置时间时接收回调。
示例如下:
Kotlin
class TimePickerFragment : DialogFragment(), TimePickerDialog.OnTimeSetListener { override fun onCreateDialog(savedInstanceState: Bundle): Dialog { // Use the current time as the default values for the picker val c = Calendar.getInstance() val hour = c.get(Calendar.HOUR_OF_DAY) val minute = c.get(Calendar.MINUTE) // Create a new instance of TimePickerDialog and return it return TimePickerDialog(activity, this, hour, minute, DateFormat.is24HourFormat(activity)) } override fun onTimeSet(view: TimePicker, hourOfDay: Int, minute: Int) { // Do something with the time chosen by the user } }
Java
public static class TimePickerFragment extends DialogFragment implements TimePickerDialog.OnTimeSetListener { @Override public Dialog onCreateDialog(Bundle savedInstanceState) { // Use the current time as the default values for the picker final Calendar c = Calendar.getInstance(); int hour = c.get(Calendar.HOUR_OF_DAY); int minute = c.get(Calendar.MINUTE); // Create a new instance of TimePickerDialog and return it return new TimePickerDialog(getActivity(), this, hour, minute, DateFormat.is24HourFormat(getActivity())); } public void onTimeSet(TimePicker view, int hourOfDay, int minute) { // Do something with the time chosen by the user } }
如需了解构造函数参数,请参阅 TimePickerDialog
类。
现在,您只需要一个可将此 Fragment 的实例添加到 Activity 的事件。
显示时间选择器
按如上所示定义 DialogFragment
之后,您便可以通过创建 DialogFragment
的实例并调用 show()
来显示时间选择器。
例如,下面的按钮在点击后会调用一个方法来显示对话框:
<Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/pick_time" android:onClick="showTimePickerDialog" />
当用户点击此按钮时,系统会调用以下方法:
Kotlin
fun showTimePickerDialog(v: View) { TimePickerFragment().show(supportFragmentManager, "timePicker") }
Java
public void showTimePickerDialog(View v) { DialogFragment newFragment = new TimePickerFragment(); newFragment.show(getSupportFragmentManager(), "timePicker"); }
此方法对上面定义的 DialogFragment
的新实例调用 show()
。show()
方法需要 FragmentManager
的实例和 Fragment 的专属标记名称。
注意:如果您的应用支持 Android 3.0 之前的版本,请务必通过调用 getSupportFragmentManager()
来获取 FragmentManager
的实例。此外,请确保显示时间选择器的 Activity 扩展的是 FragmentActivity
,而不是标准 Activity
类。
创建日期选择器
DatePickerDialog
与 TimePickerDialog
的创建过程类似。唯一的区别在于您为 Fragment 创建的对话框。
要使用 DialogFragment
显示 DatePickerDialog
,您需要定义一个 Fragment 类,用于扩展 DialogFragment
并从 Fragment 的 onCreateDialog()
方法返回 DatePickerDialog
。
扩展日期选择器的 DialogFragment
要为 DatePickerDialog
定义 DialogFragment
,您必须执行以下操作:
- 定义
onCreateDialog()
方法,以返回DatePickerDialog
的实例 - 实现
DatePickerDialog.OnDateSetListener
接口,以在用户设置日期时接收回调。
示例如下:
Kotlin
class DatePickerFragment : DialogFragment(), DatePickerDialog.OnDateSetListener { override fun onCreateDialog(savedInstanceState: Bundle): Dialog { // Use the current date as the default date in the picker val c = Calendar.getInstance() val year = c.get(Calendar.YEAR) val month = c.get(Calendar.MONTH) val day = c.get(Calendar.DAY_OF_MONTH) // Create a new instance of DatePickerDialog and return it return DatePickerDialog(activity, this, year, month, day) } override fun onDateSet(view: DatePicker, year: Int, month: Int, day: Int) { // Do something with the date chosen by the user } }
Java
public static class DatePickerFragment extends DialogFragment implements DatePickerDialog.OnDateSetListener { @Override public Dialog onCreateDialog(Bundle savedInstanceState) { // Use the current date as the default date in the picker final Calendar c = Calendar.getInstance(); int year = c.get(Calendar.YEAR); int month = c.get(Calendar.MONTH); int day = c.get(Calendar.DAY_OF_MONTH); // Create a new instance of DatePickerDialog and return it return new DatePickerDialog(getActivity(), this, year, month, day); } public void onDateSet(DatePicker view, int year, int month, int day) { // Do something with the date chosen by the user } }
如需了解构造函数参数,请参阅 DatePickerDialog
类。
现在,您只需要一个可将此 Fragment 的实例添加到 Activity 的事件。
显示日期选择器
按如上所示定义 DialogFragment
之后,您便可以通过创建 DialogFragment
的实例并调用 show()
来显示日期选择器。
例如,下面的按钮在点击后会调用一个方法来显示对话框:
<Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/pick_date" android:onClick="showDatePickerDialog" />
当用户点击此按钮时,系统会调用以下方法:
Kotlin
fun showDatePickerDialog(v: View) { val newFragment = DatePickerFragment() newFragment.show(supportFragmentManager, "datePicker") }
Java
public void showDatePickerDialog(View v) { DialogFragment newFragment = new DatePickerFragment(); newFragment.show(getSupportFragmentManager(), "datePicker"); }
此方法对上面定义的 DialogFragment
的新实例调用 show()
。show()
方法需要 FragmentManager
的实例和 Fragment 的专属标记名称。
结合使用选择器和自动填充功能
Android 8.0 引入了自动填充框架,以便用户保存数据,方便以后用于在不同应用中填充表单。选择器提供了一个界面,可让用户更改日期或时间数据存储字段中的值,因此在自动填充情境中可能会非常有用。例如,在信用卡表单中,日期选择器可能会允许用户输入或更改其信用卡的失效日期。
由于选择器是对话框,因此它们不会与其他字段一起显示在 Activity 中。如需在选择器不可见时显示选择器数据,您可以使用其他视图,例如 EditText
,它可在选择器不可见时显示相应值。
EditText
对象本身需要 AUTOFILL_TYPE_TEXT
类型的自动填充数据。相反,自动填充服务应将数据保存为 AUTOFILL_TYPE_DATE
,以便为其创建适合的表示形式。为解决类型不一致的问题,建议您创建一个继承自 EditText
的自定义视图,并实现正确处理 AUTOFILL_TYPE_DATE
类型的值所需的方法。
您应该按照以下步骤创建 EditText
的一个子类,该子类可以处理 AUTOFILL_TYPE_DATE
类型的值:
- 创建一个继承自
EditText
的类。 - 实现
getAutofillType()
方法,该方法应返回AUTOFILL_TYPE_DATE
。 - 实现
getAutofillValue()
方法,该方法应返回表示日期(以毫秒为单位)的AutofillValue
对象。如需创建返回对象,请使用forDate()
方法生成AutofillValue
对象。 - 实现
autofill()
方法。此方法提供了用于处理AutofillValue
参数(类型为AUTOFILL_TYPE_DATE
)的逻辑。如需处理该参数,请为其创建适当的字符串表示形式,如mm/yyyy
。使用字符串表示形式来设置视图的text
属性。 - 实现以下功能:当用户想要在
EditText
的自定义子类中修改日期时,显示选择器。该视图应根据用户在选择器中选择的值的字符串表示形式来更新text
属性。
如需查看 EditText
的可处理 AUTOFILL_TYPE_DATE
值的子类示例,请参阅自动填充框架示例 Java |
Kotlin。
如需详细了解如何为自定义视图提供自动填充支持,请参阅自定义视图支持。