Desenvolvi um aplicativo simples de seleção de tempo no jetpack compose. Consiste em um texto que pode ser composto e um seletor de tempo. O texto exibe a hora selecionada. No entanto, não exibe se é AM ou PM.
Aqui está um detalhamento do aplicativo. Consiste em uma coluna que contém um texto que pode ser composto e um seletor de horário. Existem três variáveis. Um mantém a hora atual usando o calendário integrado, outro mantém o estado do seletor de hora e o último formata a hora a partir do seletor de hora.
Agora aqui está o código:
// App Layout
Column(
modifier = Modifier.fillMaxSize(),
horizontalAlignment = Alignment.CenterHorizontally,
verticalArrangement = Arrangement.Center,
) {
// Variable That Stores The Current Time
val currentTime = Calendar.getInstance()
// Variable That Stores Time Picker State
val timePickerState =
rememberTimePickerState(
initialHour = currentTime[Calendar.HOUR_OF_DAY],
initialMinute = currentTime[Calendar.MINUTE],
is24Hour = false,
)
// Variable That Stores The Formatted Time
val formattedTime =
"%02d:%02d".format(
timePickerState.hour,
timePickerState.minute,
)
// Text That Displays The Selected Time
Text(text = formattedTime)
// Time Picker
TimePicker(
state = timePickerState,
)
}
Conforme declarado acima, não consigo descobrir como adicionar AM ou PM ao texto que pode ser composto ou até mesmo salvar a preferência do usuário de AM ou PM. Existe um parâmetro para o timePickerState chamado is24Hour
, porém é um booleano e causará um travamento quando adicionado a uma string.
Primeiro, você ainda está usando a antiga API de data do Java que se tornou obsoleta há 10 anos. Se você quiser usar uma API Java em vez do wrapper Kotlin (
kotlinx.datetime.*
), use a API Time do Java 8 que está localizada nosjava.time.*
pacotes:Agora, com isso resolvido, o TimePicker pode ser alternado entre um modo de seleção de 24 horas e um modo de seleção AM/PM com
is24Hour
. O resultado não é afetado por isso, porém, é apenas para conveniência do usuário. O resultadotimePickerState.hour
estará sempre no intervalo de 0 a 23 para que você possa trabalhar facilmente com ele, como fazer aritmética de tempo e assim por diante.Se você quiser exibir esse horário com um marcador AM/PM no final, isso é apenas um problema de formatação. Um que pode ser facilmente resolvido, pois já estamos utilizando a API Java Time:
Primeiro, a
LocalTime
é criado a partir do estado do TimePicker. Em seguida, ele é formatado com umDateTimeFormatter
arquivopattern
. Agora, esse padrão é a parte importante:"hh:mm a"
formata a hora como um formato AM/PM com horas no intervalo de 1 a 12 e um marcador AM/PM no final."HH:mm"
por outro lado, formata isso como um horário simples com horas no intervalo de 0 a 23.No código acima decidi alternar entre esses dois padrões dependendo de como o TimePickerState foi inicializado (
timePickerState.is24hour
). No seu código isso é semprefalse
, então você nunca verá o intervalo de 0 a 23 horas. Mas se você não definir um flatfalse
outrue
foris24hour
e torná-lo dependente de uma variável, poderá deixar o usuário escolher qual prefere. Isso afetará então o TimePicker e a hora formatada.