Gestione tastiera rimovibile

Icona di valutazione a tre stelle

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:

  1. Consenti al sistema di ricreare l'attività in esecuzione e gestisci 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 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:

  1. 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.
  2. Callback di effetti collaterali: utilizza un DisposableEffect con 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 dispositivo Configuration.
  • 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 DisposableEffect per registrare un listener di modifiche alla configurazione nell'ComponentActivity host.

    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.