Zarządzanie odłączaną klawiaturą

Ikona oceny 3 gwiazdek

Obsługa odłączanych klawiatur pomaga zwiększyć produktywność użytkowników urządzeń z dużym ekranem. Android wywołuje zmianę konfiguracji za każdym razem, gdy klawiatura jest podłączana do urządzenia lub odłączana od niego, co może spowodować utratę stanu interfejsu. Aplikacja może zapisywać i przywracać swój stan, pozwalając systemowi obsługiwać ponowne tworzenie aktywności, lub ograniczać ponowne tworzenie aktywności w przypadku zmian konfiguracji klawiatury.

We wszystkich przypadkach wszystkie dane związane z klawiaturą są przechowywane w obiekcie Configuration. Pola keyboardkeyboardHidden obiektu konfiguracji zawierają informacje o rodzaju klawiatury i jej dostępności.

Sprawdzone metody

Aplikacje zoptymalizowane pod kątem dużych ekranów obsługują wszystkie rodzaje urządzeń wejściowych, od klawiatur programowych i sprzętowych po rysiki, myszy, trackpady i inne urządzenia peryferyjne.

Obsługa klawiatur zewnętrznych wymaga zmian w konfiguracji, którymi możesz zarządzać na 2 sposoby:

  1. Pozwól systemowi odtworzyć działającą aktywność, a Ty zajmij się zarządzaniem stanem aplikacji.
  2. Samodzielne zarządzanie zmianą konfiguracji (aktywność nie zostanie ponownie utworzona):
    • Zadeklaruj wszystkie wartości konfiguracji związane z klawiaturą
    • Tworzenie procedury obsługi zmiany konfiguracji

Aplikacje zwiększające produktywność, które często wymagają precyzyjnej kontroli interfejsu użytkownika w przypadku wprowadzania tekstu i innych danych, mogą korzystać z podejścia „zrób to sam” w zakresie obsługi zmian konfiguracji.

W szczególnych przypadkach możesz chcieć zmienić układ aplikacji po podłączeniu lub odłączeniu klawiatury sprzętowej, np. aby zwiększyć ilość miejsca na narzędzia lub okna edycji.

W Jetpack Compose możesz reagować na zmiany konfiguracji klawiatury na 2 sposoby:

  1. Reaktywny interfejs: odczytuj bieżący stan konfiguracji bezpośrednio w komponentach za pomocą LocalConfiguration.current. Interfejs automatycznie zmienia układ, aby dostosować się do nowego stanu po podłączeniu lub odłączeniu klawiatury.
  2. Wywołanie zwrotne efektu ubocznego: użyj DisposableEffect, aby zarejestrować w aktywności hosta odbiornik zmian konfiguracji, który umożliwia wywoływanie zdarzeń niezwiązanych z interfejsem (np. logowania lub analiz) bez ponownego tworzenia aktywności lub tworzenia instancji elementów widoku zastępczego.

Składniki

  • android:configChanges: atrybut elementu <activity> w manifeście aplikacji. Informuje system o zmianach konfiguracji, którymi zarządza aplikacja.
  • LocalConfiguration: komponent lokalny, który udostępnia bieżące Configuration urządzenia.
  • DisposableEffect: tworzy interfejs API efektów ubocznych, który uruchamia blok kodu, gdy funkcja kompozycyjna wchodzi w skład kompozycji, i czyści go, gdy z niej wychodzi.

Kroki

Zadeklaruj atrybut configChanges i dodaj wartości związane z klawiaturą, aby zapobiec ponownemu tworzeniu aktywności. Następnie użyj LocalConfiguration.current, aby dynamicznie dostosować układ Composable, lub zarejestruj odbiornik konfiguracji za pomocą DisposableEffect.

1. Deklarowanie atrybutu configChanges

Zaktualizuj element <activity> w manifeście aplikacji, dodając wartości keyboard|keyboardHidden do listy zmian już zarządzanej konfiguracji:

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

2. Reagowanie na zmiany konfiguracji klawiatury

Aby obsługiwać zmiany konfiguracji w Jetpack Compose, użyj jednej z tych opcji w zależności od tego, czy aktualizujesz interfejs, czy wykonujesz wywołanie zwrotne efektu ubocznego:

  • Opcja A. Reaktywny interfejs (zalecana)

    Odczytaj typ klawiatury bezpośrednio z LocalConfiguration.current. Gdy klawiatura sprzętowa jest podłączona lub odłączona, ta wartość się zmienia, a Compose automatycznie ponownie komponuje interfejs.

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

  • Opcja B. Side-Effect Listener

    Jeśli po zmianie konfiguracji musisz wykonać efekt uboczny (np. logowanie, aktualizowanie lokalnej bazy danych lub wywoływanie analiz), użyj DisposableEffect, aby zarejestrować odbiornik zmian konfiguracji na hoście ComponentActivity.

    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)
        }
    }

Wyniki

Aplikacja będzie teraz reagować na podłączenie lub odłączenie klawiatury zewnętrznej bez ponownego tworzenia uruchomionej aktywności.

Dodatkowe materiały

Aby dowiedzieć się, jak zapisywać stan interfejsu aplikacji podczas zmian konfiguracji, takich jak podłączanie lub odłączanie klawiatury, przeczytaj artykuł Zapisywanie stanów interfejsu.