Die Unterstützung für abnehmbare Tastaturen trägt dazu bei, die Produktivität der Nutzer auf Geräten mit großem Bildschirm zu maximieren. Android löst jedes Mal eine Konfigurationsänderung aus, wenn eine Tastatur an ein Gerät angeschlossen oder von diesem getrennt wird. Dies kann zu einem Verlust des UI-Status führen. Ihre App kann entweder ihren Status speichern und wiederherstellen, sodass das System die Neuerstellung der Aktivität übernimmt, oder die Neuerstellung der Aktivität für Änderungen der Tastaturkonfiguration einschränken.
In allen Fällen werden alle Daten im Zusammenhang mit der Tastatur in einem Configuration-Objekt gespeichert. Die Felder keyboard und keyboardHidden des Konfigurationsobjekts enthalten Informationen zum Tastaturtyp und zur Verfügbarkeit.
Best Practices
Apps, die für große Bildschirme optimiert sind, unterstützen alle Arten von Eingabegeräten, von Software- und Hardwaretastaturen bis hin zu Eingabestiften, Mäusen, Trackpads und anderen Peripheriegeräten.
Die Unterstützung externer Tastaturen erfordert Konfigurationsänderungen, die Sie auf zwei Arten verwalten können:
- Lass das System die laufende Aktivität neu erstellen und kümmere dich um die Verwaltung des Status deiner App.
- Verwalten Sie die Konfigurationsänderung selbst (die Aktivität wird nicht neu erstellt):
- Alle tastaturbezogenen Konfigurationswerte deklarieren
- Handler für Konfigurationsänderungen erstellen
Produktivitäts-Apps, die oft eine genaue Steuerung der Benutzeroberfläche für die Texteingabe und andere Eingaben erfordern, können von der DIY-Methode zur Verarbeitung von Konfigurationsänderungen profitieren.
In besonderen Fällen kann es sinnvoll sein, das App-Layout zu ä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 Änderungen der Tastaturkonfiguration reagieren:
- Reaktive UI: Lesen Sie den aktuellen Konfigurationsstatus direkt in Ihren Composables mit
LocalConfiguration.current. Die Benutzeroberfläche wird automatisch neu zusammengesetzt, um sich an den neuen Status anzupassen, wenn eine Tastatur angeschlossen oder getrennt wird. - Callback für Nebenwirkungen: Verwenden Sie einen lebenszyklusbewussten
DisposableEffect, um einen Listener für Konfigurationsänderungen in der Hostaktivität zu registrieren. So können Sie Nicht-UI-Ereignisse (z. B. Logging oder Analysen) auslösen, 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: Composable-Lokalanbieter, der das aktuelle GerätConfigurationverfügbar macht.DisposableEffect: Compose-API für Nebenwirkungen, die einen Codeblock ausführt, wenn eine zusammensetzbare Funktion in die Komposition eintritt, und die Bereinigung durchführt, wenn sie sie verlässt.
Schritte
Deklariere das Attribut configChanges und füge tastaturbezogene Werte hinzu, um zu verhindern, dass die Aktivität neu erstellt wird. Verwende dann entweder LocalConfiguration.current, um dein kompilierbares Layout dynamisch anzupassen, oder registriere einen Konfigurations-Listener mit DisposableEffect.
1. Attribut configChanges deklarieren
Aktualisieren Sie das Element <activity> im App-Manifest, indem Sie die Werte keyboard|keyboardHidden der Liste der bereits verwalteten Konfigurationsänderungen hinzufügen:
<activity
…
android:configChanges="...|keyboard|keyboardHidden">
2. Auf Änderungen der Tastaturkonfiguration reagieren
Wenn Sie Konfigurationsänderungen in Jetpack Compose verarbeiten möchten, verwenden Sie eine der folgenden Optionen, je nachdem, ob Sie die Benutzeroberfläche aktualisieren oder einen Callback für Nebenwirkungen ausführen:
Option A: Reaktive Benutzeroberfläche (empfohlen)
Lies den Tastaturtyp direkt aus
LocalConfiguration.current. Wenn eine Hardwaretastatur angeschlossen oder getrennt wird, ändert sich dieser Wert und Compose setzt die Benutzeroberfläche 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 Nebeneffekt ausführen müssen (z. B. Logging, Aktualisieren einer lokalen Datenbank oder Auslösen von Analysen), verwenden Sie einen
DisposableEffect, um einen Listener für Konfigurationsänderungen auf dem 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 laufende 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.