Добавьте сборщиков в ваше приложение

Попробуйте способ создания композиций.
Jetpack Compose — это рекомендуемый набор инструментов для создания пользовательского интерфейса для Android. Узнайте, как добавлять компоненты в Compose.

Android предоставляет пользователю элементы управления для выбора времени или даты в виде готовых диалоговых окон. Эти окна позволяют выбирать каждую часть времени (час, минута, AM/PM) или даты (месяц, день, год).

Пример инструмента выбора времени из material.io
Рисунок 1. Выбор времени в мобильном календаре.

Использование этих полей выбора помогает гарантировать, что ваши пользователи смогут выбрать время или дату, которые являются действительными, правильно отформатированы и адаптированы к языковым настройкам пользователя.

Пример модального окна выбора даты из material.io
Рисунок 2. Модальное окно выбора даты.

Мы рекомендуем использовать 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 :

  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 , можно найти в примере Autofill Framework на Java или Kotlin .

Чтобы узнать больше о поддержке автозаполнения для ваших пользовательских представлений, см. раздел «Фреймворк автозаполнения» .