Il supporto per le tastiere rimovibili contribuisce a massimizzare la produttività degli utenti sui dispositivi con schermi di grandi dimensioni. Android attiva una modifica della configurazione ogni volta che una tastiera viene collegata o scollegata da un dispositivo, il che può causare una perdita dello stato dell'UI. La tua app può salvare e ripristinare il suo stato, consentendo al sistema di gestire la ricreazione dell'attività, oppure limitare la ricreazione dell'attività per le modifiche alla configurazione della tastiera.
In tutti i casi, tutti i dati relativi alla tastiera vengono archiviati in un Configuration
oggetto. I campi keyboard e keyboardHidden dell'oggetto di configurazione
contengono informazioni sul tipo di tastiera e sulla sua disponibilità.
Best practice
Le app ottimizzate per schermi di grandi dimensioni supportano tutti i tipi di dispositivi di input, dalle tastiere software e hardware a stilo, mouse, trackpad e altre periferiche.
Il supporto per le tastiere esterne comporta modifiche alla configurazione, che puoi gestire in due modi:
- Consenti al sistema di ricreare l'attività in esecuzione e gestisci lo stato della tua app.
- Gestisci autonomamente la modifica della configurazione (l'attività non verrà ricreata):
- Dichiara tutti i valori di configurazione relativi alla tastiera
- Crea un gestore di modifiche alla configurazione
Le app di produttività, che spesso richiedono un controllo preciso dell'UI per l'inserimento di testo e altri input, possono trarre vantaggio dall'approccio fai-da-te alla gestione delle modifiche alla configurazione.
In casi speciali, potresti voler modificare il layout dell'app quando una tastiera hardware è collegata o scollegata, ad esempio per creare più spazio per gli strumenti o le finestre di modifica.
In Jetpack Compose, puoi reagire alle modifiche alla configurazione della tastiera in due modi:
- UI reattiva: leggi lo stato di configurazione corrente direttamente nei tuoi composable utilizzando
LocalConfiguration.current. L'UI si ricompone automaticamente per adattarsi al nuovo stato quando una tastiera è collegata o scollegata. - Callback di effetti collaterali: utilizza un
DisposableEffectcon ciclo di vita per registrare un listener di modifiche alla configurazione nell'attività host, che ti consente di attivare eventi non UI (come logging o analisi) senza ricreare l'attività o creare istanze di elementi di visualizzazione fittizi.
Ingredienti
android:configChanges: attributo dell'elemento<activity>del manifest dell'app. Informa il sistema delle modifiche alla configurazione gestite dall'app.LocalConfiguration: provider locale composable che espone la del dispositivoConfiguration.DisposableEffect: API di effetti collaterali di Compose che esegue un blocco di codice quando un composable entra nella composizione e lo pulisce quando esce.
Passaggi
Dichiara l'attributo configChanges e aggiungi i valori relativi alla tastiera per impedire la ricreazione dell'attività. Poi, utilizza LocalConfiguration.current per adattare dinamicamente il layout composable oppure registra un listener di configurazione utilizzando DisposableEffect.
1. Dichiara l'attributo configChanges
Aggiorna l'elemento <activity> nel manifest dell'app aggiungendo i
keyboard|keyboardHidden valori all'elenco delle modifiche alla configurazione già gestite
<activity
…
android:configChanges="...|keyboard|keyboardHidden">
2. Rispondi alle modifiche alla configurazione della tastiera
Per gestire le modifiche alla configurazione in Jetpack Compose, utilizza una delle seguenti opzioni a seconda che tu stia aggiornando l'UI o eseguendo un callback di effetti collaterali:
Opzione A: UI reattiva (consigliata)
Leggi il tipo di tastiera direttamente da
LocalConfiguration.current. Quando una tastiera hardware è collegata o scollegata, questo valore cambia e Compose ricompone automaticamente l'UI.val configuration = LocalConfiguration.current val isPhysicalKeyboardAttached = configuration.keyboard == Configuration.KEYBOARD_QWERTY if (isPhysicalKeyboardAttached) { // Render layout optimized for physical keyboard } else { // Render default layout }
Opzione B: listener di effetti collaterali
Se devi eseguire un effetto collaterale (ad esempio logging, aggiornamento di un database locale o attivazione di analisi) quando la configurazione cambia, utilizza un
DisposableEffectper registrare un listener di modifiche alla configurazione nell'ComponentActivityhost.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) } }
Risultati
Ora l'app risponderà al collegamento o allo scollegamento di una tastiera esterna senza ricreare l'attività in esecuzione.
Risorse aggiuntive
Per scoprire come salvare lo stato dell'UI dell'app durante le modifiche alla configurazione, come il collegamento o lo scollegamento della tastiera, consulta Salvare gli stati dell'UI.