Reaguj, aby skupić

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

Obserwowanie stanu zaznaczenia za pomocą onFocusChanged

Modyfikator onFocusChanged udostępnia obiekt FocusState, gdy element uzyskuje lub traci zaznaczenie.

Możesz na przykład obserwować zmiany zaznaczenia, aby aktualizować stan komponentu niestandardowego (np. zmieniać kolor obramowania elementu lub uruchamiać 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 między rekompozycjami, a kolor obramowania jest aktualizowany przy każdej zmianie stanu zaznaczenia elementu.

Właściwości FocusState

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

  • isFocused: zwraca wartość true, jeśli określony element kompozycyjny, do którego jest dołączony ten modyfikator, jest obecnie aktywny.
  • hasFocus: zwraca wartość true, jeśli ten element kompozycyjny lub którykolwiek z jego elementó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órykolwiek z ich elementów podrzędnych jest aktywny.
  • isCaptured: zwraca true, jeśli zaznaczenie jest obecnie zablokowane na elemencie (np. podczas interakcji podrzędnych w oknie modalnym przy użyciu captureFocus()). Próba przeniesienia zaznaczenia na inne elementy nie powoduje usunięcia zaznaczenia.
Modifier.onFocusChanged { focusState ->
    val isFocused = focusState.isFocused
    val hasFocus = focusState.hasFocus
    val isCaptured = focusState.isCaptured
}