向应用添加选择器

Android 提供一些控件,供用户选择 现成可用的对话框。这些选择器提供了用于选择各个控件的控件 部分时间(小时、分钟、AM/PM)或日期(月、日、年)。

<ph type="x-smartling-placeholder">。 <ph type="x-smartling-placeholder">
</ph> Material.io 中的时间选择器示例
图 1.在移动设备日历选择器中选择时段。

使用这些选择器有助于确保用户可以选择格式正确且已根据用户所在的语言区域进行调整的有效时间或日期。

Material.io 中的模态日期选择器示例
图 2. 模态日期选择器。

我们建议您使用 DialogFragment 来托管每个时间或日期选择器DialogFragment负责管理 对话框生命周期,让您可以以不同的布局显示选择器 例如,在手机上的基本对话框中或作为 API 的嵌入部分, 大屏设备上的布局

创建时间选择器

要显示 TimePickerDialog 使用 DialogFragment 定义一个 fragment 类,用于扩展 DialogFragment,并从TimePickerDialog Fragment 的 onCreateDialog() 方法。

扩展时间选择器的 DialogFragment

如需为 TimePickerDialog 定义 DialogFragment,请执行以下操作: 执行以下操作:

示例如下:

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,请执行以下操作: 执行以下操作:

示例如下:

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 类型的值:

  1. 创建一个继承自 EditText 的类。
  2. 实施 getAutofillType() 方法,该方法会返回 AUTOFILL_TYPE_DATE
  3. 实施 getAutofillValue() 方法,该方法会返回 AutofillValue 表示日期(以毫秒为单位)的对象。如需创建退货 对象,请使用 forDate() 方法来生成 AutofillValue 对象。
  4. 实施 autofill() 方法。此方法提供了用于处理 AutofillValue 参数,其类型 AUTOFILL_TYPE_DATE。要处理 参数,请创建一个适当的 其字符串表示形式,例如 mm/yyyy。使用字符串 设置视图的 text 属性。
  5. 实现以下功能:当用户想要在 EditText 的自定义子类中修改日期时,显示选择器。视图更新 将 text 属性替换为该值的字符串表示形式 用户在选择器中选择的指标

有关处理 EditText 的子类的示例, AUTOFILL_TYPE_DATE 值,请参阅 JavaKotlin

如需详细了解如何为自定义视图提供自动填充支持,请参阅 自动填充框架