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