Selektory czasu umożliwiają użytkownikom wybór czasu. Aby wdrożyć selektor czasu w aplikacji, możesz użyć komponentów TimePicker
i TimeInput
.
Typy
Istnieją 2 typy selektora czasu:
- Pokrętło: pozwala użytkownikom ustawiać czas przez przesuwanie uchwytu po pokrętle.
- Wprowadzanie: użytkownicy mogą ustawiać czas za pomocą klawiatury.
Na poniższym obrazie po lewej stronie znajduje się selektor czasu na tarczy, a po prawej – selektor czasu w polu wejściowym:
Interfejs API
Aby zaimplementować selektor czasu, użyj komponentu TimePicker
lub TimeInput
:
TimePicker
: implementacja selektora czasu połączenia.TimeInput
: implementuje selektor czasu.
Region
W przypadku TimePicker
i TimeInput
musisz też przekazać wartość TimePickerState
. Dzięki temu możesz ustawić domyślny czas, który będzie wyświetlany w selektorze. Zapisuje też czas wybrany przez użytkownika za pomocą selektora.
Dialog
Wybieraki czasu pojawiają się w oknach. Przykłady w tym przewodniku nie korzystają z dialogów. Przykłady dialogów znajdziesz w przewodniku Dialogi dla selektorów czasu.
Selektor godziny w dialerze
Ten fragment kodu pokazuje, jak zaimplementować podstawowy selektor czasu.
@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") } } }
Zwróć uwagę na te kwestie w tym fragmencie kodu:
Calendar.getInstance()
inicjalizujeTimePickerState
z bieżącym czasem.- W tym przykładzie użyto znacznika
java.util.Calendar
. Włącz w projekcie desugaring interfejsu API Java 8 i nowszych, aby móc używać interfejsujava.time.LocalTime
we wszystkich wersjach Androida.
- W tym przykładzie użyto znacznika
- Element kompozytywny
TimePicker
wyświetla selektor czasu, przyjmująctimePickerState
jako parametr. - Implementacja zawiera 2 przyciski: jeden do potwierdzenia wyboru i drugi do zamknięcia selektora.
Ta implementacja wygląda tak:
Selektor godziny
Ten fragment kodu pokazuje, jak zaimplementować podstawowy selektor czasu w stylu wprowadzania danych.
@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") } } }
Ważne kwestie dotyczące tej implementacji:
- Struktura jest w podstawie taka sama jak w przypadku selektora czasu na tarczy, z tym, że zamiast atrybutu
TimePicker
jest używany atrybutTimeInput
. - Parametr
is24Hour
w przypadkutimePickerState
jest jawnie ustawiony natrue
. Domyślna wartość tofalse
.
Ta implementacja wygląda tak:
Użyj stanu
Aby wykorzystać czas wybrany przez użytkownika w selektorze czasu, przekaż odpowiednią wartość TimePickerState
do funkcji onConfirm
. Składany element nadrzędny może uzyskać dostęp do wybranego czasu za pomocą funkcji TimePickerState.hour
i TimePickerState.minute
.
Poniżej znajdziesz fragment kodu, który pokazuje, jak to zrobić:
@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") } } }
Następnie możesz wywołać komponent w ten sposób:
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.")
}
Więcej informacji znajdziesz w pełnej implementacji w aplikacji snippety.