Verwaltung abnehmbarer Tastatur

Symbol für Bewertung mit drei Sternen

Durch die Unterstützung abnehmbarer Tastaturen können Nutzer auf Geräten mit großen Bildschirmen produktiver arbeiten. Android löst jedes Mal eine Konfigurationsänderung aus, wenn eine Tastatur an ein Gerät angeschlossen oder von diesem getrennt wird. Dadurch kann der UI-Status verloren gehen. Ihre App kann ihren Status entweder speichern und wiederherstellen, sodass das System die Neuerstellung der Aktivität übernimmt, oder die Neuerstellung der Aktivität einschränken bei Konfigurationsänderungen der Tastatur.

In jedem Fall werden alle Daten zur Tastatur in einem Configuration Objekt gespeichert. Die keyboard und keyboardHidden Felder des Konfiguration objekts enthalten Informationen zum Tastaturtyp und zur Verfügbarkeit.

Best Practices

Für große Bildschirme optimierte Apps unterstützen alle Arten von Eingabegeräten, von Software- und Hardwaretastaturen bis hin zu Stiften, Mäusen, Trackpads und anderen Peripheriegeräten.

Die Unterstützung externer Tastaturen umfasst Konfigurationsänderungen, die Sie auf zwei Arten verwalten können:

  1. Lassen Sie das System die ausgeführte Aktivität neu erstellen und kümmern Sie sich um die Verwaltung des Status Ihrer App.
  2. Verwalten Sie die Konfigurationsänderung selbst (die Aktivität wird nicht neu erstellt):
    • Deklarieren Sie alle tastaturbezogenen Konfigurationswerte.
    • Erstellen Sie einen Handler für Konfigurationsänderungen.

Produktivitäts-Apps, die oft eine genaue Steuerung der UI für die Texteingabe und andere Eingaben erfordern, können von der eigenständigen Verwaltung von Konfigurationsänderungen profitieren.

In bestimmten Fällen möchten Sie möglicherweise das App-Layout ändern, wenn eine Hardwaretastatur angeschlossen oder getrennt wird, z. B. um mehr Platz für Tools oder Bearbeitungsfenster zu schaffen.

In Jetpack Compose können Sie auf zwei Arten auf Konfigurationsänderungen der Tastatur reagieren:

  1. Reaktive UI:Lesen Sie den aktuellen Konfigurationsstatus direkt in Ihren Composables mit LocalConfiguration.current. Die UI wird automatisch neu zusammengesetzt, um sich an den neuen Status anzupassen, wenn eine Tastatur angeschlossen oder getrennt wird.
  2. Side-Effect-Callback:Verwenden Sie ein lebenszyklusbezogenes DisposableEffect, um einen Listener für Konfigurationsänderungen in der Host-Aktivität zu registrieren. So können Sie Ereignisse auslösen, die nicht zur UI gehören (z. B. Logging oder Analysen), ohne die Aktivität neu zu erstellen oder Dummy-Ansichtselemente zu instanziieren.

Zutaten

  • android:configChanges: Attribut des <activity> -Elements des App-Manifests. Informiert das System über Konfigurationsänderungen, die von der App verwaltet werden.
  • LocalConfiguration: Zusammensetzbarer lokaler Anbieter, der das aktuelle Gerät Configuration verfügbar macht.
  • DisposableEffect: Compose-Side-Effect-API, die einen Codeblock ausführt, wenn ein Composable in die Komposition eintritt, und ihn bereinigt, wenn er sie verlässt.

Schritte

Deklarieren Sie das Attribut configChanges und fügen Sie tastaturbezogene Werte hinzu, um die Neuerstellung der Aktivität zu verhindern. Verwenden Sie dann entweder LocalConfiguration.current, um Ihr Composable-Layout dynamisch anzupassen, oder registrieren Sie einen Konfigurationslistener mit DisposableEffect.

1. configChanges-Attribut deklarieren

Aktualisieren Sie das <activity> Element im App-Manifest, indem Sie der Liste der bereits verwalteten Konfigurations änderungen die keyboard|keyboardHidden Werte hinzufügen:

<activity
            android:configChanges="...|keyboard|keyboardHidden">

2. Auf Konfigurationsänderungen der Tastatur reagieren

Verwenden Sie eine der folgenden Optionen, um Konfigurationsänderungen in Jetpack Compose zu verarbeiten, je nachdem, ob Sie die UI aktualisieren oder einen Side-Effect-Callback ausführen:

  • Option A: Reaktive UI (empfohlen)

    Lesen Sie den Tastaturtyp direkt aus LocalConfiguration.current. Wenn eine Hardwaretastatur angeschlossen oder getrennt wird, ändert sich dieser Wert und Compose setzt Ihre UI automatisch neu zusammen.

    val configuration = LocalConfiguration.current
    val isPhysicalKeyboardAttached = configuration.keyboard == Configuration.KEYBOARD_QWERTY
    
    if (isPhysicalKeyboardAttached) {
        // Render layout optimized for physical keyboard
    } else {
        // Render default layout
    }

  • Option B: Side-Effect-Listener

    Wenn Sie bei einer Konfigurationsänderung einen Side-Effect ausführen müssen (z. B. Logging, Aktualisieren einer lokalen Datenbank oder Auslösen von Analysen), verwenden Sie ein DisposableEffect, um einen Listener für Konfigurationsänderungen in der Host-ComponentActivity zu registrieren.

    val context = LocalActivity.current
    DisposableEffect(context) {
        val activity = context as? ComponentActivity
        val listener = Consumer<Configuration> { newConfig ->
            val hasKeyboard = newConfig.keyboard == Configuration.KEYBOARD_QWERTY
            // Trigger non-UI actions, analytics, etc.
        }
        activity?.addOnConfigurationChangedListener(listener)
        onDispose {
            activity?.removeOnConfigurationChangedListener(listener)
        }
    }

Ergebnisse

Ihre App reagiert jetzt auf das Anschließen oder Trennen einer externen Tastatur, ohne die ausgeführte Aktivität neu zu erstellen.

Zusätzliche Ressourcen

Informationen zum Speichern des UI-Status Ihrer App bei Konfigurationsänderungen wie dem Anschließen oder Trennen einer Tastatur finden Sie unter UI-Status speichern.