Изучение Kotlin в Android Studio: работа с DatePicker и TimePicker

В приложениях постоянно нужно что-то запланировать: напоминание, будильник, дату доставки. Писать поле для ручного ввода цифр неудобно — проще дать пользователю готовый календарь и часы. Сегодня в Android Studio мы разберём, как с помощью языка Kotlin добавить удобный выбор даты и времени. Этот урок проведёт вас через создание стандартных диалогов, которые работают на всех версиях Android и не требуют дополнительных библиотек.


DatePickerDialog: выбираем дату

DatePickerDialog — это готовое окно с календарём, в котором можно листать месяцы и нажимать на число. Чтобы его показать, создайте экземпляр DatePickerDialog, передайте текущую дату и слушатель, который сработает после выбора.

val calendar = Calendar.getInstance()
val year = calendar.get(Calendar.YEAR)
val month = calendar.get(Calendar.MONTH)
val day = calendar.get(Calendar.DAY_OF_MONTH)

val datePicker = DatePickerDialog(this, { _, selectedYear, selectedMonth, selectedDay ->
    val result = "$selectedDay.${selectedMonth + 1}.$selectedYear"
    dateText.text = result
}, year, month, day)

showDateButton.setOnClickListener {
    datePicker.show()
}

Обратите внимание: месяц возвращается от 0 до 11, поэтому при отображении прибавляем единицу. Полученную дату можно показать в TextView или использовать для дальнейших расчётов.


TimePickerDialog: устанавливаем время

Выбор времени работает аналогично. TimePickerDialog принимает начальные часы, минуты и флаг 24-часового формата. В слушателе получаем выбранное время и выводим его.

val timePicker = TimePickerDialog(this, { _, hourOfDay, minute ->
    val result = String.format("%02d:%02d", hourOfDay, minute)
    timeText.text = result
}, 12, 0, true)

showTimeButton.setOnClickListener {
    timePicker.show()
}

Флаг true означает, что часы будут отображаться в 24-часовом формате. Если передать false, появятся AM/PM.


Разметка экрана

В activity_main.xml разместим две кнопки и два текстовых поля для отображения результата. Кнопкам зададим понятные надписи и id.

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:padding="24dp"
    android:gravity="center">

    <Button
        android:id="@+id/showDateButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Выбрать дату" />

    <TextView
        android:id="@+id/dateText"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="20sp"
        android:layout_marginTop="16dp" />

    <Button
        android:id="@+id/showTimeButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Выбрать время" />

    <TextView
        android:id="@+id/timeText"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="20sp"
        android:layout_marginTop="16dp" />
</LinearLayout>

Полный код MainActivity

class MainActivity : AppCompatActivity() {
    private lateinit var dateText: TextView
    private lateinit var timeText: TextView

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        dateText = findViewById(R.id.dateText)
        timeText = findViewById(R.id.timeText)
        val showDateButton = findViewById<Button>(R.id.showDateButton)
        val showTimeButton = findViewById<Button>(R.id.showTimeButton)

        showDateButton.setOnClickListener { showDatePicker() }
        showTimeButton.setOnClickListener { showTimePicker() }
    }

    private fun showDatePicker() {
        val calendar = Calendar.getInstance()
        DatePickerDialog(
            this,
            { _, year, month, day ->
                dateText.text = "$day.${month + 1}.$year"
            },
            calendar.get(Calendar.YEAR),
            calendar.get(Calendar.MONTH),
            calendar.get(Calendar.DAY_OF_MONTH)
        ).show()
    }

    private fun showTimePicker() {
        val calendar = Calendar.getInstance()
        TimePickerDialog(
            this,
            { _, hour, minute ->
                timeText.text = String.format("%02d:%02d", hour, minute)
            },
            calendar.get(Calendar.HOUR_OF_DAY),
            calendar.get(Calendar.MINUTE),
            true
        ).show()
    }
}

Полезные мелочи

  • Ограничивайте диапазон дат. Если нужно запретить выбор прошлых дней, используйте datePicker.minDate = System.currentTimeMillis() на объекте DatePicker, полученном из диалога.
  • Используйте DialogFragment. При повороте экрана обычный DatePickerDialog теряется. Оборачивайте его в DialogFragment для сохранения состояния.
  • Material DatePicker. Google рекомендует использовать MaterialDatePicker из библиотеки Material Components — он выглядит современнее и поддерживает выбор диапазона дат.

Коротко о главном

На сегодняшнем занятии в Android Studio, используя язык Kotlin, вы узнали, как за несколько строк кода реализовать выбор даты и времени. Вы создали диалоги DatePickerDialog и TimePickerDialog, обработали полученные данные и отобразили их на экране. Теперь у вас есть простой и эффективный способ получения календарных данных от пользователя. Попробуйте внедрить эти диалоги в своё приложение для создания заметок или планирования — интерфейс сразу станет более удобным.