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:
- Lassen Sie das System die ausgeführte Aktivität neu erstellen und kümmern Sie sich um die Verwaltung des Status Ihrer App.
- 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:
- 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. - 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ätConfigurationverfü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-ComponentActivityzu 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.