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 keyboard i keyboardHidden 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:
- Pozwól systemowi odtworzyć działającą aktywność, a Ty zajmij się zarządzaniem stanem aplikacji.
- 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:
- 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. - 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żąceConfigurationurzą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ścieComponentActivity.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.