Reagieren, um den Fokus zu schärfen

Jedes Mal, wenn sich der Fokus im Kompositionsbaum ändert, löst Compose ein Fokusereignis aus, das von übergeordneten und untergeordneten Modifikatoren beobachtet werden kann. Mit dem Modifikator onFocusChanged können Sie auf Übergänge des Fokusstatus warten, aktuelle Fokuseigenschaften abfragen und statusgesteuerte UI-Updates auslösen.

Fokusstatus mit onFocusChanged beobachten

Der Modifikator onFocusChanged stellt ein FocusState-Objekt bereit, wenn ein Element den Fokus erhält oder verliert.

Sie können beispielsweise Fokusänderungen beobachten, um den Status einer benutzerdefinierten Komponente zu aktualisieren (z. B. die Rahmenfarbe eines Elements ändern oder eine Animation auslösen):

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

In diesem Beispiel speichert remember die Rahmenfarbe über Neuzusammensetzungen hinweg und die Rahmenfarbe wird aktualisiert, wenn sich der Fokusstatus des Elements ändert.

FocusState-Eigenschaften

Das an onFocusChanged übergebene FocusState-Objekt bietet drei wichtige Eigenschaften:

  • isFocused: Gibt true zurück, wenn das spezifische Composable, an das dieser Modifikator angehängt ist, derzeit den aktiven Eingabefokus hat.
  • hasFocus: Gibt true zurück, wenn diese zusammensetzbare Funktion oder eine ihrer untergeordneten zusammensetzbaren Funktionen derzeit im Fokus ist. Das ist nützlich für übergeordnete Container (z. B. Karten oder Symbolleisten), die wissen müssen, wann ein untergeordnetes Element aktiv ist.
  • isCaptured: Gibt true zurück, wenn der Fokus derzeit auf das Element beschränkt ist (z. B. während modaler Unterinteraktionen mit captureFocus()). Wenn der Fokus erfasst ist, wird er nicht gelöscht, wenn versucht wird, ihn auf andere Elemente zu verschieben.
Modifier.onFocusChanged { focusState ->
    val isFocused = focusState.isFocused
    val hasFocus = focusState.hasFocus
    val isCaptured = focusState.isCaptured
}