Seletores de horário

Os seletores de horário oferecem uma maneira de os usuários selecionarem um horário. É possível usar os elementos combináveis TimePicker e TimeInput para implementar um seletor de horário no app.

Tipos

Há dois tipos de seletor de horário:

  • Seletor: permite que os usuários definam um horário movendo uma alça em torno de um mostrador.
  • Entrada: permite que os usuários definam um horário usando o teclado.

A imagem a seguir mostra um exemplo de um seletor de horário de discagem à esquerda e um seletor de horário de entrada à direita:

Um mostrador e um seletor de horário de entrada.
Figura 1. Um mostrador e um seletor de horário de entrada.

Superfície da API

Para implementar um seletor de horário, use o elemento combinável TimePicker ou TimeInput:

  • TimePicker: implementa um seletor de horário de discagem.
  • TimeInput: implementa um seletor de horário de entrada.

Estado

Para TimePicker e TimeInput, também é necessário transmitir um TimePickerState. Isso permite definir o horário selecionado padrão que aparece no seletor. Ele também captura o horário que o usuário selecionou usando o seletor.

Dialog

Os seletores de horário aparecem em caixas de diálogo. Os exemplos neste guia não usam caixas de diálogo. Para exemplos que usam caixas de diálogo, consulte o guia Caixas de diálogo para seletores de horário.

Seletor de horário do discador

Este snippet demonstra como implementar um seletor de horário básico.

@Composable
fun DialExample(
    onConfirm: () -> Unit,
    onDismiss: () -> Unit,
) {
    val currentTime = Calendar.getInstance()

    val timePickerState = rememberTimePickerState(
        initialHour = currentTime.get(Calendar.HOUR_OF_DAY),
        initialMinute = currentTime.get(Calendar.MINUTE),
        is24Hour = true,
    )

    Column {
        TimePicker(
            state = timePickerState,
        )
        Button(onClick = onDismiss) {
            Text("Dismiss picker")
        }
        Button(onClick = onConfirm) {
            Text("Confirm selection")
        }
    }
}

Considere o seguinte neste snippet:

  • Calendar.getInstance() inicializa o TimePickerState com o horário atual.
    • Este exemplo usa java.util.Calendar. Ative a simplificação de APIs Java 8+ no seu projeto para usar java.time.LocalTime em todas as versões do Android.
  • O elemento combinável TimePicker mostra o seletor de horário, usando timePickerState como parâmetro.
  • A implementação inclui dois botões: um para confirmar a seleção e outro para dispensar o seletor.

Essa implementação aparece da seguinte maneira:

Um seletor de horário de discagem. O usuário pode selecionar um horário usando o mostrador.
Figura 2. Um seletor de horário de discagem.

Seletor de horário de entrada

Este snippet demonstra como implementar um seletor de horário básico do estilo de entrada.

@Composable
fun InputExample(
    onConfirm: () -> Unit,
    onDismiss: () -> Unit,
) {
    val currentTime = Calendar.getInstance()

    val timePickerState = rememberTimePickerState(
        initialHour = currentTime.get(Calendar.HOUR_OF_DAY),
        initialMinute = currentTime.get(Calendar.MINUTE),
        is24Hour = true,
    )

    Column {
        TimeInput(
            state = timePickerState,
        )
        Button(onClick = onDismiss) {
            Text("Dismiss picker")
        }
        Button(onClick = onConfirm) {
            Text("Confirm selection")
        }
    }
}

Pontos principais desta implementação:

  • A estrutura é basicamente a mesma do seletor de horário do mostrador, com a principal diferença sendo o uso de TimeInput em vez de TimePicker.
  • O parâmetro is24Hour de timePickerState é definido explicitamente como true. Por padrão, esse valor é false.

Essa implementação aparece da seguinte maneira:

Um seletor de horário de entrada. O usuário pode inserir um horário usando campos de texto.
Figura 3. Um seletor de horário de entrada.

Usar o estado

Para usar o horário selecionado pelo usuário em um seletor de horário, transmita o TimePickerState apropriado para a função onConfirm. O elemento combinável pai pode acessar o horário selecionado usando TimePickerState.hour e TimePickerState.minute.

O snippet a seguir demonstra como fazer isso:

@Composable
fun DialUseStateExample(
    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,
    )

    Column {
        TimePicker(
            state = timePickerState,
        )
        Button(onClick = onDismiss) {
            Text("Dismiss picker")
        }
        Button(onClick = { onConfirm(timePickerState) }) {
            Text("Confirm selection")
        }
    }
}

Você pode chamar o elemento combinável assim:

var selectedTime: TimePickerState? by remember { mutableStateOf(null) }

// ...

DialUseStateExample(
    onDismiss = {
        showDialExample = false
    },
    onConfirm = {
            time ->
        selectedTime = time
        showDialExample = false
    },
)

// ...

if (selectedTime != null) {
    val cal = Calendar.getInstance()
    cal.set(Calendar.HOUR_OF_DAY, selectedTime!!.hour)
    cal.set(Calendar.MINUTE, selectedTime!!.minute)
    cal.isLenient = false
    Text("Selected time = ${formatter.format(cal.time)}")
} else {
    Text("No time selected.")
}

Para mais detalhes, consulte a implementação completa no app Snippets.

Outros recursos