Android предоставляет пользователю элементы управления для выбора времени или даты в виде готовых диалоговых окон. Эти окна позволяют выбирать каждую часть времени (час, минута, AM/PM) или даты (месяц, день, год).
Использование этих полей выбора помогает гарантировать, что ваши пользователи смогут выбрать время или дату, которые являются действительными, правильно отформатированы и адаптированы к языковым настройкам пользователя.
Мы рекомендуем использовать DialogFragment для размещения каждого элемента выбора времени или даты. DialogFragment управляет жизненным циклом диалогового окна и позволяет отображать элементы выбора в различных конфигурациях макета, например, в простом диалоговом окне на мобильных устройствах или в качестве встроенной части макета на больших экранах.
Создайте средство выбора времени
Чтобы отобразить TimePickerDialog с помощью DialogFragment , определите класс фрагмента, который наследует DialogFragment , и верните TimePickerDialog из метода onCreateDialog() фрагмента.
Расширьте функционал DialogFragment для выбора времени.
Чтобы определить DialogFragment для TimePickerDialog , выполните следующие действия:
- Определите метод
onCreateDialog(), который будет возвращать экземпляр классаTimePickerDialog. - Реализуйте интерфейс
TimePickerDialog.OnTimeSetListener, чтобы получать обратный вызов, когда пользователь устанавливает время.
Вот пример:
Котлин
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 .
Теперь вам просто нужно событие, которое добавит экземпляр этого фрагмента в вашу активность.
Показать средство выбора времени
После определения DialogFragment как в предыдущем примере, вы можете отобразить средство выбора времени, создав экземпляр DialogFragment и вызвав метод show() .
Например, вот кнопка, при нажатии на которую вызывается метод для отображения диалогового окна:
<Button android:id="@+id/pickTime" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Pick time" />
Когда пользователь нажимает эту кнопку, система вызывает следующий метод:
Котлин
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 и уникальное имя тега для фрагмента.
Создать средство выбора даты
Создание DatePickerDialog аналогично созданию TimePickerDialog . Разница заключается в диалоговом окне, которое вы создаете для фрагмента.
Чтобы отобразить DatePickerDialog с помощью DialogFragment , определите класс фрагмента, который наследует DialogFragment , и верните DatePickerDialog из метода onCreateDialog() фрагмента.
Расширьте функционал DialogFragment для выбора даты.
Чтобы определить DialogFragment для DatePickerDialog , выполните следующие действия:
- Определите метод
onCreateDialog(), который будет возвращать экземпляр классаDatePickerDialog. - Реализуйте интерфейс
DatePickerDialog.OnDateSetListener, чтобы получать обратный вызов, когда пользователь устанавливает дату.
Вот пример:
Котлин
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 .
Вам просто нужно событие, которое добавит экземпляр этого фрагмента в вашу активность.
Показать средство выбора даты
После определения DialogFragment как в предыдущем примере, вы можете отобразить средство выбора даты, создав экземпляр DialogFragment и вызвав show() .
Например, вот кнопка, при нажатии на которую вызывается метод для отображения диалогового окна:
<Button android:id="@+id/pickDate" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Pick date"/>
Когда пользователь нажимает эту кнопку, система вызывает следующий метод:
Котлин
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 и уникальное имя тега для фрагмента.
Используйте средства выбора с функцией автозаполнения.
В 2017 году Android представил фреймворк Autofill , который позволяет пользователям сохранять данные для заполнения форм в различных приложениях. В сценариях автозаполнения могут быть полезны средства выбора даты и времени (picker), предоставляющие пользовательский интерфейс, позволяющий изменять значение поля, хранящего дату или время. Например, в форме ввода данных кредитной карты средство выбора даты позволяет пользователям ввести или изменить срок действия своей кредитной карты.
Поскольку поля выбора представляют собой диалоговые окна, они не отображаются в активности вместе с другими полями. Чтобы отобразить данные поля выбора, когда оно невидимо, можно использовать другое представление, например, 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 , можно найти в примере Autofill Framework на Java или Kotlin .
Чтобы узнать больше о поддержке автозаполнения для ваших пользовательских представлений, см. раздел «Фреймворк автозаполнения» .
