Il supporto delle 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'interfaccia utente. 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 oggetto Configuration. 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 delle tastiere esterne comporta modifiche alla configurazione, che puoi gestire in due modi:
- Consenti al sistema di ricreare l'attività in esecuzione e occupati di gestire 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 delle modifiche alla configurazione
Le app di produttività, che spesso richiedono un controllo preciso dell'interfaccia utente 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 attuale della configurazione direttamente nei tuoi
componenti componibili utilizzando
LocalConfiguration.current. La UI si ricompone automaticamente per adattarsi al nuovo stato quando una tastiera viene collegata o scollegata. - Callback con effetti collaterali:utilizza un
DisposableEffectsensibile al ciclo di vita per registrare un listener di modifica della configurazione nell'attività host, che ti consente di attivare eventi non UI (come logging o analisi) senza ricreare l'attività o istanziare 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: fornitore locale componibile che espone l'Configurationcorrente del dispositivo.DisposableEffect: crea un'API con effetti collaterali che esegue un blocco di codice quando un elemento componibile entra nella composizione e lo pulisce quando esce.
Passaggi
Dichiara l'attributo configChanges e aggiungi valori correlati alla tastiera per impedire
la ricreazione dell'attività. Poi, utilizza LocalConfiguration.current per
adattare dinamicamente il layout componibile o registra un listener di configurazione
utilizzando DisposableEffect.
1. Dichiarare l'attributo configChanges
Aggiorna l'elemento <activity> nel file manifest dell'app aggiungendo i
valori keyboard|keyboardHidden all'elenco delle modifiche alla configurazione già gestite:
<activity
…
android:configChanges="...|keyboard|keyboardHidden">
2. Rispondere 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 la 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 fisica è collegata o scollegata, questo valore cambia e Compose ricompone automaticamente la 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: Side-Effect Listener
Se devi eseguire un effetto collaterale (ad esempio logging, aggiornamento di un database locale o attivazione di Analytics) quando la configurazione cambia, utilizza un
DisposableEffectper registrare un listener di modifica della configurazione sull'hostComponentActivity.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 la tua 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'interfaccia utente dell'app durante le modifiche alla configurazione, ad esempio l'aggancio o lo sgancio della tastiera, consulta Salvare gli stati dell'interfaccia utente.