В приложениях постоянно нужно что-то запланировать: напоминание, будильник, дату доставки. Писать поле для ручного ввода цифр неудобно — проще дать пользователю готовый календарь и часы. Сегодня в 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, обработали полученные данные и отобразили их на экране. Теперь у вас есть простой и эффективный способ получения календарных данных от пользователя. Попробуйте внедрить эти диалоги в своё приложение для создания заметок или планирования — интерфейс сразу станет более удобным.