Инструменты выбора времени часто появляются в диалогах. Вы можете использовать относительно общую и минимальную реализацию диалога или реализовать собственный диалог с большей гибкостью.
Дополнительную информацию о диалогах в целом, в том числе о том, как использовать состояние выбора времени, см. в руководстве по выбору времени .
Базовый пример
Самый простой способ создать диалоговое окно для выбора времени — создать составной объект, реализующий AlertDialog
. Следующий фрагмент представляет собой пример относительно минимального диалога, использующего этот подход:
@Composable
fun DialWithDialogExample(
onConfirm: (TimePickerState) -> Unit,
onDismiss: () -> Unit,
) {
val currentTime = Calendar.getInstance()
val timePickerState = rememberTimePickerState(
initialHour = currentTime.get(Calendar.HOUR_OF_DAY),
initialMinute = currentTime.get(Calendar.MINUTE),
is24Hour = true,
)
TimePickerDialog(
onDismiss = { onDismiss() },
onConfirm = { onConfirm(timePickerState) }
) {
TimePicker(
state = timePickerState,
)
}
}
@Composable
fun TimePickerDialog(
onDismiss: () -> Unit,
onConfirm: () -> Unit,
content: @Composable () -> Unit
) {
AlertDialog(
onDismissRequest = onDismiss,
dismissButton = {
TextButton(onClick = { onDismiss() }) {
Text("Dismiss")
}
},
confirmButton = {
TextButton(onClick = { onConfirm() }) {
Text("OK")
}
},
text = { content() }
)
}
Обратите внимание на ключевые моменты в этом фрагменте:
- Составной элемент
DialWithDialogExample
оборачиваетTimePicker
в диалоговое окно. -
TimePickerDialog
— это пользовательский составной элемент, который создаетAlertDialog
со следующими параметрами:-
onDismiss
: функция, вызываемая, когда пользователь закрывает диалог (с помощью кнопки закрытия или перехода назад). -
onConfirm
: функция, вызываемая, когда пользователь нажимает кнопку «ОК». -
content
: составной элемент, который отображает средство выбора времени в диалоговом окне.
-
-
AlertDialog
включает в себя:- Кнопка отклонения с надписью «Отклонить».
- Кнопка подтверждения с надписью «ОК».
- Содержимое средства выбора времени передается как
text
параметр.
-
DialWithDialogExample
инициализируетTimePickerState
текущим временем и передает его как вTimePicker
, так и в функциюonConfirm
.

Расширенный пример
Этот фрагмент демонстрирует расширенную реализацию настраиваемого диалогового окна выбора времени в Jetpack Compose.
@Composable
fun AdvancedTimePickerExample(
onConfirm: (TimePickerState) -> Unit,
onDismiss: () -> Unit,
) {
val currentTime = Calendar.getInstance()
val timePickerState = rememberTimePickerState(
initialHour = currentTime.get(Calendar.HOUR_OF_DAY),
initialMinute = currentTime.get(Calendar.MINUTE),
is24Hour = true,
)
/** Determines whether the time picker is dial or input */
var showDial by remember { mutableStateOf(true) }
/** The icon used for the icon button that switches from dial to input */
val toggleIcon = if (showDial) {
Icons.Filled.EditCalendar
} else {
Icons.Filled.AccessTime
}
AdvancedTimePickerDialog(
onDismiss = { onDismiss() },
onConfirm = { onConfirm(timePickerState) },
toggle = {
IconButton(onClick = { showDial = !showDial }) {
Icon(
imageVector = toggleIcon,
contentDescription = "Time picker type toggle",
)
}
},
) {
if (showDial) {
TimePicker(
state = timePickerState,
)
} else {
TimeInput(
state = timePickerState,
)
}
}
}
@Composable
fun AdvancedTimePickerDialog(
title: String = "Select Time",
onDismiss: () -> Unit,
onConfirm: () -> Unit,
toggle: @Composable () -> Unit = {},
content: @Composable () -> Unit,
) {
Dialog(
onDismissRequest = onDismiss,
properties = DialogProperties(usePlatformDefaultWidth = false),
) {
Surface(
shape = MaterialTheme.shapes.extraLarge,
tonalElevation = 6.dp,
modifier =
Modifier
.width(IntrinsicSize.Min)
.height(IntrinsicSize.Min)
.background(
shape = MaterialTheme.shapes.extraLarge,
color = MaterialTheme.colorScheme.surface
),
) {
Column(
modifier = Modifier.padding(24.dp),
horizontalAlignment = Alignment.CenterHorizontally
) {
Text(
modifier = Modifier
.fillMaxWidth()
.padding(bottom = 20.dp),
text = title,
style = MaterialTheme.typography.labelMedium
)
content()
Row(
modifier = Modifier
.height(40.dp)
.fillMaxWidth()
) {
toggle()
Spacer(modifier = Modifier.weight(1f))
TextButton(onClick = onDismiss) { Text("Cancel") }
TextButton(onClick = onConfirm) { Text("OK") }
}
}
}
}
}
Обратите внимание на ключевые моменты в этом фрагменте:
- Составной компонент
AdvancedTimePickerExample
создает настраиваемое диалоговое окно выбора времени. - Он использует компонуемый
Dialog
для большей гибкости, чемAlertDialog
. - Диалоговое окно включает настраиваемый заголовок и кнопку переключения между режимами набора и ввода.
-
Surface
применяет форму и высоту к диалоговому окну, используяIntrinsicSize.Min
как для ширины, так и для высоты. - Макет
Column
иRow
обеспечивает компоненты структуры диалогового окна. - В примере отслеживается режим выбора с помощью
showDial
.-
IconButton
переключает режимы, соответствующим образом обновляя значок. - Содержимое диалогового окна переключается между
TimePicker
иTimeInput
в зависимости от состоянияshowDial
.
-
Эта расширенная реализация предоставляет настраиваемый и многократно используемый диалог выбора времени, который можно адаптировать к различным вариантам использования в вашем приложении.
Эта реализация выглядит следующим образом:
