Освой Android играючи
/* Моя кошка замечательно разбирается в программировании. Стоит мне объяснить проблему ей - и все становится ясно. */
John Robbins, Debugging Applications, Microsoft Press, 2000
Обновлено: 23.05.2023, 1 сентября 2025
Компонент TimePicker позволяет пользователю выбрать время (часы, минуты). Данный виджет используют как правило на отдельном экране. Также существует похожее по функционалу диалоговое окно TimePickerDialog.
TimePicker раньше находился в разделе Date & Time в Android Studio 3.01. Сейчас на панели инструментов данного компонента нет, поэтому придётся добавлять вручную.
В Android 5 (API 21) внешний вид компонента изменился.
Добавим на экран текстовую метку и компонент выбора времени:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Время"
android:textAppearance="?android:attr/textAppearanceLarge" />
<TimePicker
android:id="@+id/timePicker"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
Пользователь может выбрать любое время на компоненте. Изменение времени можно наблюдать через слушатель OnTimeChangedListener(). Напишем пример, где программно установим время, будем отслеживать изменение времени пользователем и получать установленное время через нажатие кнопки.
package ru.alexanderklimov.timepickerdemo
import android.os.Bundle
import android.widget.TextView
import android.widget.TimePicker
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import java.util.Calendar
class MainActivity : AppCompatActivity() {
private lateinit var timePicker: TimePicker
private lateinit var infoTextView: TextView
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
timePicker = findViewById(R.id.timePicker)
infoTextView = findViewById(R.id.textView)
val now = Calendar.getInstance()
timePicker.hour = now.get(Calendar.HOUR_OF_DAY)
timePicker.minute = now.get(Calendar.MINUTE)
timePicker.setOnTimeChangedListener { _, hourOfDay, minute ->
Toast.makeText(
applicationContext, "onTimeChanged",
Toast.LENGTH_SHORT
).show()
infoTextView.text = "$hourOfDay:$minute"
}
}
}
В API 23 часть методов была признана устаревшими и вместо них теперь используются новые методы без слова Current:
Новый внешний вид в Android 5 Lollipop (API 21)

Так выглядит на Android 6.

Так выглядел компонент раньше.

В 2021 году в составе библиотеки Material Design появился компонент MaterialTimePicker.
Добавляем зависимость.
// первоначально появилось в версии 1.2.0-alpha03
implementation'com.google.android.material:material:1.2.0-alpha04'
Следует указать, что приложение использует тему из семейства Theme.MaterialComponents. Я использовал следующий вариант в styles.xml. Иначе приложение будет завершаться с ошибкой.
<style name="AppTheme" parent="Theme.MaterialComponents.Light.DarkActionBar">
<!-- Customize your theme here. -->
...
</style>
Добавим кнопку на экран для вызова диалогового окна выбора даты. В обработчик щелчка добавим код.
button.setOnClickListener {
val builder = MaterialDatePicker.Builder.datePicker()
val picker = builder.build()
picker.show(supportFragmentManager, picker.toString())
picker.addOnCancelListener {
Log.d("DatePicker", "Dialog was cancelled")
}
picker.addOnNegativeButtonClickListener {
Log.d("DatePicker", "Dialog Negative Button was clicked")
}
picker.addOnPositiveButtonClickListener {
Log.d("DatePicker", "Date: ${picker.headerText}, Date epoch value = ${it}")
}
}
В код также добавлены слушатели для различных событий - отмена окна выбора даты, щелчок на кнопке Cancel, щелчок на кнопке OK.

Иногда нужно выбрать не конкретную дату, а некоторый интервал. В этом случае нужно заменить одну строчку кода.
//val builder = MaterialDatePicker.Builder.datePicker()
val builder = MaterialDatePicker.Builder.dateRangePicker()
Теперь выбор интервала делается двумя щелчками. Третий щелчок отменяет предыдущий выбранный интервал и начинает процесс заново. Кнопкой Cancel в этом окне является крестик в левом верхнем углу, а кнопкой OK выступает кнопка Save. Нажатие кнопки "Назад" вызовет событие закрытия диалогового окна для слушателя addOnCancelListener().

Так как теперь выбираются две даты, то немного исправим вывод значений.
picker.addOnPositiveButtonClickListener {
Log.d("DatePicker", "Date: ${picker.headerText}, Date epoch value = ${it}")
// другой вариант для работы с Pair<Long, Long>
Log.d("DatePicker",
"Date String = ${picker.headerText}, Date epoch values::${it
.first}:: to :: ${it.second}")
}