La compatibilité avec les claviers amovibles permet d'optimiser la productivité des utilisateurs sur les appareils à grand écran. Android déclenche un changement de configuration chaque fois qu'un clavier est connecté ou déconnecté d'un appareil, ce qui peut entraîner une perte d'état de l'interface utilisateur. Votre application peut soit enregistrer et restaurer son état, ce qui permet au système de gérer la recréation de l'activité, soit limiter la recréation de l'activité pour les modifications de configuration du clavier.
Dans tous les cas, toutes les données liées au clavier sont stockées dans un Configuration
objet. Les champs keyboard et keyboardHidden de l'objet de configuration
contiennent des informations sur le type de clavier et sa disponibilité.
Bonnes pratiques
Les applications optimisées pour les grands écrans sont compatibles avec tous les types de périphériques d'entrée, des claviers logiciels et matériels aux stylets, souris, pavés tactiles et autres périphériques.
La compatibilité avec les claviers externes implique des modifications de configuration que vous pouvez gérer de deux manières :
- Laissez le système recréer l'activité en cours d'exécution et gérez l'état de votre application.
- Gérez vous-même la modification de la configuration (l'activité ne sera pas recréée) :
- Déclarez toutes les valeurs de configuration liées au clavier.
- Créez un gestionnaire de modifications de configuration.
Les applications de productivité, qui nécessitent souvent un contrôle précis de l'interface utilisateur pour la saisie de texte et d'autres entrées, peuvent bénéficier de l'approche "faites-le vous-même" pour gérer les modifications de configuration.
Dans certains cas, vous pouvez modifier la mise en page de votre application lorsqu'un clavier matériel est connecté ou déconnecté, par exemple pour libérer de l'espace pour les outils ou les fenêtres d'édition.
Dans Jetpack Compose, vous pouvez réagir aux modifications de configuration du clavier de deux manières :
- Interface utilisateur réactive : lisez l'état de configuration actuel directement dans vos composables à l'aide de
LocalConfiguration.current. L'interface utilisateur se recompose automatiquement pour s'adapter au nouvel état lorsqu'un clavier est connecté ou déconnecté. - Rappel d'effet secondaire : utilisez un
DisposableEffectsensible au cycle de vie pour enregistrer un écouteur de modification de configuration sur l'activité hôte, ce qui vous permet de déclencher des événements non liés à l'interface utilisateur (comme la journalisation ou l'analyse) sans recréer l'activité ni instancier d'éléments de vue factices.
Ingrédients
android:configChanges: attribut de l'élément<activity>du fichier manifeste de l'application. Informe le système des modifications de configuration gérées par l'application.LocalConfiguration: fournisseur local composable qui expose le appareilConfiguration.DisposableEffect: API d'effet secondaire Compose qui exécute un bloc de code lorsqu'un composable entre dans la composition et le nettoie lorsqu'il la quitte.
Étapes
Déclarez l'attribut configChanges et ajoutez des valeurs liées au clavier pour éviter la recréation de l'activité. Ensuite, utilisez LocalConfiguration.current pour adapter dynamiquement votre mise en page composable ou enregistrez un écouteur de configuration à l'aide de DisposableEffect.
1. Déclarer l'attribut configChanges
Mettez à jour l'élément <activity> dans le fichier manifeste de l'application en ajoutant les
keyboard|keyboardHidden valeurs à la liste des modifications de configuration déjà gérées
:
<activity
…
android:configChanges="...|keyboard|keyboardHidden">
2. Répondre aux modifications de configuration du clavier
Pour gérer les modifications de configuration dans Jetpack Compose, utilisez l'une des options suivantes, selon que vous mettez à jour l'interface utilisateur ou que vous exécutez un rappel d'effet secondaire :
Option A : Interface utilisateur réactive (recommandée)
Lisez le type de clavier directement à partir de
LocalConfiguration.current. Lorsqu'un clavier matériel est connecté ou déconnecté, cette valeur change et Compose recompose automatiquement votre interface utilisateur.val configuration = LocalConfiguration.current val isPhysicalKeyboardAttached = configuration.keyboard == Configuration.KEYBOARD_QWERTY if (isPhysicalKeyboardAttached) { // Render layout optimized for physical keyboard } else { // Render default layout }
Option B : Écouteur d'effet secondaire
Si vous devez exécuter un effet secondaire (tel que la journalisation, la mise à jour d'une base de données locale ou le déclenchement d'une analyse) lorsque la configuration change, utilisez un
DisposableEffectpour enregistrer un écouteur de modification de configuration sur leComponentActivityhôte.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) } }
Résultats
Votre application répondra désormais à la connexion ou à la déconnexion d'un clavier externe sans recréer l'activité en cours d'exécution.
Ressources supplémentaires
Pour savoir comment enregistrer l'état de l'interface utilisateur de votre application lors de modifications de configuration telles que la connexion ou la déconnexion d'un clavier, consultez Enregistrer les états de l'interface utilisateur.