Android 提供一些控件,供用户选择 现成可用的对话框。这些选择器提供了用于选择各个控件的控件 部分时间(小时、分钟、AM/PM)或日期(月、日、年)。
<ph type="x-smartling-placeholder">。 <ph type="x-smartling-placeholder">使用这些选择器有助于确保用户可以选择格式正确且已根据用户所在的语言区域进行调整的有效时间或日期。
我们建议您使用
DialogFragment
来托管每个时间或日期选择器DialogFragment
负责管理
对话框生命周期,让您可以以不同的布局显示选择器
例如,在手机上的基本对话框中或作为 API 的嵌入部分,
大屏设备上的布局
创建时间选择器
要显示
TimePickerDialog
使用 DialogFragment
定义一个 fragment 类,用于扩展
DialogFragment
,并从TimePickerDialog
Fragment 的
onCreateDialog()
方法。
扩展时间选择器的 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 the user picks. } }
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 the user picks. } }
请参阅 TimePickerDialog
类,了解
构造函数参数。
现在您只需要一个将此 Fragment 的实例添加到 活动。
显示时间选择器
定义如上所示的 DialogFragment
后
例如,您可以通过创建
DialogFragment
,然后调用
show()
方法。
例如,点按以下按钮时,系统会调用一个方法来显示 对话框:
<Button android:id="@+id/pickTime" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Pick time" />
当用户点按此按钮时,系统会调用以下方法:
Kotlin
findViewById<Button>(R.id.pickTime).setOnClickListener { TimePickerFragment().show(supportFragmentManager, "timePicker") }
Java
findViewById<Button>(R.id.pickTime).setOnClickListener { TimePickerFragment().show(supportFragmentManager, "timePicker"); }
此方法会在show()
前面示例中定义的 DialogFragment
。通过
show()
方法需要以下实例:
FragmentManager
以及 fragment 的唯一标记名称。
创建日期选择器
创建
DatePickerDialog
就像创建 TimePickerDialog
一样。不同之处在于
为 fragment 创建的所有属性。
如需使用 DialogFragment
显示 DatePickerDialog
,请执行以下操作:
定义一个扩展 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(requireContext(), this, year, month, day) } override fun onDateSet(view: DatePicker, year: Int, month: Int, day: Int) { // Do something with the date the user picks. } }
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(requireContext(), this, year, month, day); } public void onDateSet(DatePicker view, int year, int month, int day) { // Do something with the date the user picks. } }
请参阅
DatePickerDialog
类。
您只需要一个将此 Fragment 的实例添加到 活动。
显示日期选择器
按照前面的示例定义 DialogFragment
后,
您可以创建一个实例来显示日期选择器
DialogFragment
并调用 show()
。
例如,点按以下按钮时,系统会调用一个方法来显示 对话框:
<Button android:id="@+id/pickDate" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Pick date"/>
当用户点按此按钮时,系统会调用以下方法:
Kotlin
findViewById<Button>(R.id.pickDate).setOnClickListener { val newFragment = DatePickerFragment() newFragment.show(supportFragmentManager, "datePicker") }
Java
findViewById<Button>(R.id.pickDate).setOnClickListener { val newFragment = DatePickerFragment(); newFragment.show(supportFragmentManager, "datePicker"); }
此方法会在show()
前面示例中定义的 DialogFragment
。通过
show()
方法需要 FragmentManager
的实例
以及 fragment 的唯一标记名称。
使用具有自动填充功能的选择器
2017 年,Android 推出了 自动填充框架, 用户保存的数据可用于在不同应用中填写表单。选择器 它通过提供可让用户更改 存储日期或时间数据的字段的值。例如,在信用卡中 通过日期选择器,用户可以输入或更改 信用卡。
由于选择器是对话框,因此它们不会与其他字段一起显示在 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。
如需详细了解如何为自定义视图提供自动填充支持,请参阅 自动填充框架。