Selektory czasu umożliwiają użytkownikom wybieranie godziny. Aby zaimplementować selektor czasu w aplikacji, możesz
użyć elementów kompozycyjnych TimePicker i TimeInput.
Typy
Dostępne są 2 typy selektorów czasu:
- Wybieranie: umożliwia użytkownikom ustawianie czasu przez przesuwanie uchwytu wokół tarczy.
- Wpisywanie: umożliwia użytkownikom ustawianie czasu za pomocą klawiatury.
Poniższy obraz przedstawia przykład selektora czasu z wybieraniem po lewej stronie i selektora czasu z wpisywaniem po prawej stronie:
Powierzchnia interfejsu API
Aby zaimplementować selektor czasu, użyj elementu kompozycyjnego TimePicker lub TimeInput:
TimePicker: implementuje selektor czasu z wybieraniem.TimeInput: implementuje selektor czasu z wpisywaniem.
Stan
W przypadku elementów kompozycyjnych TimePicker i TimeInput musisz też przekazać a
TimePickerState. Umożliwia to ustawienie domyślnego wybranego czasu, który będzie wyświetlany w selektorze. Rejestruje też czas wybrany przez użytkownika za pomocą selektora.
Dialog
Selektory czasu pojawiają się w oknach. Przykłady w tym przewodniku nie używają okien. Przykłady, które używają okien, znajdziesz w przewodniku Okna selektorów czasu.
Selektor czasu z wybieraniem
Ten fragment kodu pokazuje, jak zaimplementować podstawowy selektor czasu z wybieraniem.
@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") } } }
W tym fragmencie kodu zwróć uwagę na te kwestie:
Calendar.getInstance()inicjujeTimePickerStatez bieżącym czasem.- Ten przykład używa
java.util.Calendar. Aby używaćjava.time.LocalTimewe wszystkich wersjach Androida, włącz desugaryzację interfejsu API Java 8+ w projekcie.
- Ten przykład używa
- Element kompozycyjny
TimePickerwyświetla selektor czasu, przyjmująctimePickerStatejako parametr. - Implementacja zawiera 2 przyciski: jeden do potwierdzania wyboru, a drugi do zamykania selektora.
Ta implementacja wygląda tak:
Selektor czasu z wpisywaniem
Ten fragment kodu pokazuje, jak zaimplementować podstawowy selektor czasu z wpisywaniem.
@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") } } }
Najważniejsze kwestie w tej implementacji:
- Struktura jest zasadniczo taka sama jak w przypadku selektora czasu z wybieraniem. Główna różnica polega na użyciu
TimeInputzamiastTimePicker. - Parametr
is24HourdlatimePickerStatejest wyraźnie ustawiony natrue. Domyślnie ta wartość tofalse.
Ta implementacja wygląda tak:
Używanie stanu
Aby użyć czasu wybranego przez użytkownika w selektorze czasu, przekaż odpowiedni TimePickerState do funkcji onConfirm. Element kompozycyjny nadrzędny może wtedy uzyskać dostęp do wybranego czasu za pomocą TimePickerState.hour i TimePickerState.minute.
Poniższy fragment kodu 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ć element kompozycyjny 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 z fragmentami kodu.