Os seletores de horário geralmente aparecem em caixas de diálogo. Você pode usar uma implementação relativamente genérica e mínima de uma caixa de diálogo ou implementar uma caixa de diálogo personalizada com mais flexibilidade.
Para mais informações sobre caixas de diálogo em geral, incluindo como usar o estado do seletor de horário, consulte o guia de seletores de horário.
Exemplo básico
A maneira mais simples de criar uma caixa de diálogo para o seletor de horário é
criar um elemento combinável que implemente AlertDialog
. O snippet a seguir
fornece um exemplo de uma caixa de diálogo relativamente mínima usando essa abordagem:
@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() } ) }
Observe os pontos principais neste snippet:
- O elemento combinável
DialWithDialogExample
envolveTimePicker
em uma caixa de diálogo. TimePickerDialog
é um elemento combinável personalizado que cria umAlertDialog
com os seguintes parâmetros:onDismiss
: uma função chamada quando o usuário dispensa a caixa de diálogo (pelo botão de dispensa ou navegação de volta).onConfirm
: uma função chamada quando o usuário clica no botão "OK".content
: um elemento combinável que mostra o seletor de horário na caixa de diálogo.
- O
AlertDialog
inclui:- Um botão de dispensação com a mensagem "Dispensar".
- Um botão de confirmação com a mensagem "OK".
- O conteúdo do seletor de horário transmitido como o parâmetro
text
.
- O
DialWithDialogExample
inicializa oTimePickerState
com o horário atual e o transmite para a funçãoTimePicker
eonConfirm
.
Exemplo avançado
Este snippet demonstra uma implementação avançada de uma caixa de diálogo personalizável do seletor de horário no 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") } } } } } }
Observe os pontos principais neste snippet:
- O elemento combinável
AdvancedTimePickerExample
cria uma caixa de diálogo personalizável do seletor de horário. - Ele usa um elemento combinável
Dialog
para ter mais flexibilidade do que oAlertDialog
. - A caixa de diálogo inclui um título personalizável e um botão de alternância para alternar entre os modos de discagem e de entrada.
Surface
aplica a forma e a elevação à caixa de diálogo, comIntrinsicSize.Min
para largura e altura.- O layout
Column
eRow
fornecem os componentes da estrutura da caixa de diálogo. - O exemplo rastreia o modo do seletor usando
showDial
.- Um
IconButton
alterna entre os modos, atualizando o ícone de acordo com isso. - O conteúdo da caixa de diálogo alterna entre
TimePicker
eTimeInput
com base no estadoshowDial
.
- Um
Essa implementação avançada fornece uma caixa de diálogo de seletor de horário altamente personalizável e reutilizável que pode ser adaptada a diferentes casos de uso no app.
Essa implementação aparece da seguinte maneira: