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 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:

  1. Consenti al sistema di ricreare 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 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:

  1. 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.
  2. Callback con 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 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'Configuration corrente 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 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 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.