Reaguj, aby skupić

Za każdym razem, gdy w drzewie kompozycji zmienia się fokus, Compose wywołuje zdarzenie focus, które mogą obserwować modyfikatory nadrzędne i podrzędne. Możesz użyć modyfikatora onFocusChanged, aby monitorować przejścia stanu fokusu, wysyłać zapytania o bieżące właściwości fokusu i wywoływać aktualizacje interfejsu oparte na stanie.

Obserwowanie stanu aktywności za pomocą funkcji onFocusChanged

Modyfikator onFocusChanged udostępnia obiekt FocusState, gdy element zyskuje lub traci fokus.

Możesz na przykład obserwować zmiany fokusu, aby aktualizować stan komponentu niestandardowego (np. zmieniać kolor obramowania elementu lub wywoływać animację):

var color by remember { mutableStateOf(Color.White) }
Card(
    modifier = Modifier
        .onFocusChanged {
            color = if (it.isFocused) Red else White
        }
        .border(5.dp, color)
) {}

W tym przykładzie remember przechowuje kolor obramowania w różnych kompozycjach, a kolor obramowania jest aktualizowany za każdym razem, gdy zmienia się stan fokusu elementu.

Właściwości FocusState

Obiekt FocusState przekazywany do funkcji onFocusChanged zawiera 3 kluczowe właściwości:

  • isFocused: zwraca wartość true, jeśli konkretny komponent, do którego jest dołączony ten modyfikator, ma obecnie aktywny fokus.
  • hasFocus: zwraca wartość true, jeśli ten komponent lub którykolwiek z jego komponentów podrzędnych jest obecnie zaznaczony. Jest to przydatne w przypadku kontenerów nadrzędnych (takich jak karty lub paski narzędzi), które muszą wiedzieć, kiedy któreś z dzieci w nich jest aktywne.
  • isCaptured: zwraca wartość true, jeśli fokus jest obecnie zablokowany na elemencie (np. podczas interakcji podrzędnych w oknie modalnym z użyciem captureFocus()). Podczas przechwytywania próby przeniesienia fokusu na inne elementy nie powodują jego wyczyszczenia.
Modifier.onFocusChanged { focusState ->
    val isFocused = focusState.isFocused
    val hasFocus = focusState.hasFocus
    val isCaptured = focusState.isCaptured
}