Selektory czasu

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:

Pokrętło i pole wyboru czasu.
Rysunek 1. Selektor czasu z wybieraniem i selektor czasu z wpisywaniem.

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() inicjuje TimePickerState z bieżącym czasem.
    • Ten przykład używa java.util.Calendar. Aby używać java.time.LocalTime we wszystkich wersjach Androida, włącz desugaryzację interfejsu API Java 8+ w projekcie.
  • Element kompozycyjny TimePicker wyświetla selektor czasu, przyjmując timePickerState jako parametr.
  • Implementacja zawiera 2 przyciski: jeden do potwierdzania wyboru, a drugi do zamykania selektora.

Ta implementacja wygląda tak:

Selektor czasu w formie tarczy. Użytkownik może wybrać godzinę za pomocą pokrętła.
Rysunek 2. Selektor czasu z wybieraniem.

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 TimeInput zamiast TimePicker.
  • Parametr is24Hour dla timePickerState jest wyraźnie ustawiony na true. Domyślnie ta wartość to false.

Ta implementacja wygląda tak:

Selektor czasu wprowadzania. Użytkownik może wpisać godzinę w polach tekstowych.
Rysunek 3. Selektor czasu z wpisywaniem.

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.

Dodatkowe materiały