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.
Il sera nécessaire
de répéter l'opération sur toutes les activités
prenant en charge le changement de configuration
Où 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).
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é.
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...