Changement de configuration lors de l'exécution

 

Les changements possibles

Les causes de ces changements peuvent être:

  • La modification de la taille des fontes demandée par l'utilisateur
  • Une simple rotation de l'écran
  • Le changement de la langue courante demandé par l'utilisateur
  • Changement de carte SIM
  • L'ouverture ou fermeture du clavier physique.
  • Changement mode UI (Passage de jour à nuit, ...)
  • ...

 

Traitement standard de changement de configuration

En standard, lors de modifications importantes de la configuration d'un appareil, Android relance l'activité active afin qu'elle puisse prendre en compte ces modifications.

- L'activité est donc tout d'abord tuée. En passant, il faut donc sauver l'état de l'activité (comme expliqué dans la cas de la rotation de l'écran)...

- Puis relançait pour permettre le chargement des ressources correspondant à la nouvelle configuration (en restaurant l'état).

 

Indiquer à Android que l'activité sait traiter un changement de configuration

Il est cependant possible de modifier ce fonctionnement en indiquant à Android que l'activité sait prendre en compte le ou les modifications de configuration.

Pour prévenir Android, il faut passer par le fichier ManifestAndroid.xml. Il faut ajouter l'attribut android:configChanges="valeur" dans la section de l'activité capable de gérer ce changement.

Image non trouvée !Il sera nécessaire de répéter l'opération sur toutes les activités prenant en charge le changement de configuration

valeur peut prendre la ou les valeurs suivantes:

 

Valeur Désignation
mcc ou mnc Changement de la carte SIM (mcc pour mobile country code changé et mnc pour mobile network code changé).
locale Changement de la langue courante à utiliser depuis l'écran de paramétrage de l'appareil.
keyboardHidden Ouverture ou fermeture du clavier physique.
keyboard Changement du clavier (clavier numérique à un clavier complet ou branchement d'un clavier).
fontScale Changement de la taille par défaut d'une fonte depuis l'écran de paramétrage de l'appareil.
uiMode Modification du mode UI (passage du jour à la nuit ou inversement, ...)
orientation L'écran passe du mode portrait à paysage (landscape en anglais) ou inversement. (Attention depuis HoneyComb (API 12), il faut tester screenSize !
screenLayout Changement du screen layout (activation d'un autre écran).
screenSize Changement de la taille de l'écran (peut se produire simplement en faisant une rotation de l'écran).
smallestScreenSize Changement physique de la taille de l'écran (API level 12), Par exemple en connectant l'appareil sur un écran externe.

valeur peut par exemple être positionnée à screenSize|orientation|keyboardHidden pour gérer la rotation de l'écran (cas d'utilisation le plus courant).

Image non trouvée !Seules les valeurs précisées dans android:configChanges seront prises en compte par l'activité. Tous autres changements de configuration non traités provoqueront la relance de l'activité.

Image non trouvée !Il existe d'autres codes, comme le changement touchscreen. mais à part un démontage de l'appareil, cela ne devrait pas se produire...

 

La méthode onConfigurationChanged

Pour que l'activité traite le changement de configuration, il faut redéfinir la méthode:

public void onConfigurationChanged(Configuration newConfig)

Celle-ci reçoit en paramètre une instance de Configuration qui contient la nouvelle configuration de l'appareil.

Il est impératif de faire un super.onConfigurationChanged(newConfig);

Cela permettra d'avoir les ressources correspondant à la nouvelle configuration chargée.

Vous traiterez ensuite les informations de l'instance de Configuration avec les constantes de cette classe. Par exemple:

if (newConfig.keyboardHidden == Configuration.KEYBOARDHIDDEN_NO) { ... }

 

Exemple de code

Il suffit de regarder celui pour la gestion personnalisée de la rotation de l'écran...