Gestione tastiera rimovibile

Icona di valutazione a tre stelle

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 della UI. L'app può salvare e ripristinare il proprio stato, consentendo al sistema di gestire la ricreazione dell'attività, o 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 ogni tipo di dispositivo di input, dalle tastiere software e hardware a stilo, mouse, trackpad e altri dispositivi periferici.

Il supporto delle tastiere esterne comporta modifiche alla configurazione, che puoi gestire in uno dei due modi seguenti:

  1. Lascia che il sistema ricrei l'attività in esecuzione e occupati di gestire lo stato della tua app.
  2. 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 della UI per l'inserimento di testo e altri input, possono trarre vantaggio dall'approccio fai da te per la gestione delle modifiche alla configurazione.

In casi speciali, potresti voler modificare il layout dell'app quando una tastiera hardware viene collegata o scollegata, ad esempio per fare più spazio per gli strumenti o le finestre di modifica.

In Jetpack Compose, puoi reagire alle modifiche alla configurazione della tastiera in due modi:

  1. UI reattiva:leggi lo stato di configurazione attuale direttamente nei tuoi elementi componibili utilizzando LocalConfiguration.current. La UI si ricompone automaticamente per adattarsi al nuovo stato quando viene collegata o scollegata una tastiera.
  2. Callback degli effetti collaterali:utilizza un DisposableEffect sensibile al ciclo di vita per registrare un listener di modifica della configurazione nell'attività host, che ti consente di attivare eventi non relativi alla UI (come il logging o l'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 componibile che espone il Configuration del dispositivo corrente.
  • DisposableEffect: API Compose per gli 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 relativi 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. Dichiara 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. 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'interfaccia utente o eseguendo un callback di effetto collaterale:

  • Opzione A: UI reattiva (consigliata)

    Leggi il tipo di tastiera direttamente da LocalConfiguration.current. Quando una tastiera hardware viene 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: listener di effetti collaterali

    Se devi eseguire un effetto collaterale (ad esempio il logging, l'aggiornamento di un database locale o l'attivazione di analisi) quando la configurazione cambia, utilizza un DisposableEffect per registrare un listener di modifica della configurazione sull'host 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)
        }
    }

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 della UI dell'app durante le modifiche alla configurazione, ad esempio il collegamento o lo scollegamento della tastiera, consulta Salva gli stati della UI.