Selektory czasu umożliwiają użytkownikom wybranie godziny. Aby wdrożyć selektor czasu w aplikacji, możesz użyć komponentów TimePicker
i TimeInput
.
Typy
Są 2 rodzaje selektora godziny:
- 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
Zarówno w przypadku TimePicker
, jak i TimeInput
musisz też przekazać 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
Wybieracze czasu pojawiają się w oknach. W przykładach w tym przewodniku nie ma okien dialogowych. 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") } } }
Weź pod uwagę te kwestie:
Calendar.getInstance()
inicjalizujeTimePickerState
z bieżącym czasem.- W tym przykładzie użyto elementu
java.util.Calendar
. Włącz w projekcie desugaring interfejsu API Java 8 i nowszych wersji, aby móc używać interfejsujava.time.LocalTime
we wszystkich wersjach Androida.
- W tym przykładzie użyto elementu
- 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 czasu wprowadzania danych
Ten fragment kodu pokazuje, jak zaimplementować podstawowy selektor czasu w stylu input.
@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 zasadzie taka sama jak selektor czasu wybierania numeru, z tą różnicą, że zamiast
TimePicker
używa się właściwościTimeInput
. - Parametr
is24Hour
elementutimePickerState
ma wyraźnie wartośćtrue
. Domyślna wartość tofalse
.
Ta implementacja wygląda tak:
Użyj stanu
Aby wykorzystać czas wybrany przez użytkownika w selektorze czasu, przekaż do funkcji onConfirm
odpowiednią wartość TimePickerState
. Nadrzędna funkcja kompozycyjna będzie mieć wtedy dostęp do wybranego czasu za pomocą właściwości 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") } } }
Możesz w ten sposób wywołać funkcję kompozycyjną:
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.