Zarządzanie odłączaną klawiaturą

Ikona oceny 3 gwiazdek

Obsługa odłączanych klawiatur pomaga zwiększyć produktywność użytkowników na urządzeniach 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 albo zapisywać i przywracać swój stan, pozwalając systemowi na obsługę ponownego tworzenia aktywności, albo ograniczać ponowne tworzenie aktywności w przypadku zmian konfiguracji klawiatury.

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

Sprawdzone metody

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

Obsługa klawiatur zewnętrznych wiąże się ze zmianami konfiguracji, którymi możesz zarządzać na 2 sposoby:

  1. Pozwól systemowi na ponowne utworzenie uruchomionej aktywności, a Ty zajmij się zarządzaniem stanem aplikacji.
  2. Samodzielnie zarządzaj zmianą konfiguracji (aktywność nie zostanie ponownie utworzona):
    • Zadeklaruj wszystkie wartości konfiguracji związane z klawiaturą.
    • Utwórz moduł obsługi zmian konfiguracji.

Aplikacje zwiększające produktywność, które często wymagają precyzyjnej kontroli interfejsu w przypadku wprowadzania tekstu i innych danych, mogą korzystać z samodzielnego podejścia do obsługi zmian konfiguracji.

W szczególnych przypadkach możesz chcieć zmienić układ aplikacji, gdy klawiatura sprzętowa jest podłączona lub odłączona, np. aby zwolnić więcej miejsca na narzędzia lub okna edycji.

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

  1. Interfejs reaktywny: odczytuj bieżący stan konfiguracji bezpośrednio w elementach kompozycyjnych za pomocą LocalConfiguration.current. Gdy klawiatura jest podłączona lub odłączona, interfejs automatycznie się przekomponowuje, aby dostosować się do nowego stanu.
  2. Wywołanie zwrotne efektu ubocznego: użyj DisposableEffect z uwzględnieniem cyklu życia, aby zarejestrować odbiornik zmian konfiguracji w aktywności hosta, co pozwoli Ci wywoływać zdarzenia niezwiązane z interfejsem (np. logowanie lub analizy) bez ponownego tworzenia aktywności ani 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: lokalny dostawca kompozycyjny, który udostępnia bieżące urządzenie Configuration.
  • DisposableEffect: interfejs API efektu ubocznego Compose, który uruchamia blok kodu, gdy element kompozycyjny 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 elementu kompozycyjnego, lub zarejestruj odbiornik konfiguracji za pomocą DisposableEffect.

1. Zadeklaruj atrybut configChanges

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

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

2. Reaguj 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: interfejs reaktywny (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 przekomponowuje 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: odbiornik efektu ubocznego

    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 w aktywności hosta 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.