Laisser l'activité gérer la rotation de l'écran

 

Après avoir vu qu'il était possible d'interdire la rotation, de laisser Android tuer l'application mais en sauvant l'état avant, voici une troisième possibilité:

Indiquer à Android que l'activité peut gérer la rotation de l'écran. L'avantage, il ne sera pas nécessaire de sauver l'état de l'activité, puisqu'elle va continuer de vivre ! Par contre, il faudra récupérer les informations de l'écran (champs de saisis, ...) car ils vont être redessinés pour prendre en compte le nouvel espace disponible !

 

Indiquer à Android que l'activité prend en charge la rotation de l'écran

Pour indiquer à Android que l'activité peut gérer la rotation de l'écran, il suffit de l'indiquer dans AndroidManifest.xml dans la section de l'activité (cf. changement de configuration lors de l'exécution):

Ici, nous voulons gérer la rotation. Il faut donc prendre en compte:

- keyboardHidden: pour clavier ouvert ou fermé qui provoque le changement de rotation de l'écran

- orientation: dés que l'appareil est tourné

- et depuis honeyComb (API 12), il est obligatoire de traiter screensize qui se déclenche lorsque l'appareil passe du mode portrait à paysage et inversement !

- voire smallestScreenSize, déclenché lorsque vous connectez votre appareil sur un écran externe.

D'où l'ajout de la ligne suivante:

android:configChanges="screenSize|orientation|keyboardHidden"

Image non trouvée !Il sera nécessaire de répéter l'opération sur toutes les activités prenant en charge la rotation de l'écran.

 

Prendre en compte le changement de configuration dans l'activité

La prise en compte se fait en redéfinissant la méthode onConfigurationChanged dans l'activité:

@Override
public void onConfigurationChanged(Configuration newConfig) {

super.onConfigurationChanged(newConfig);

...votre code...

}

Image non trouvée !Les fichiers de ressources sont déjà pré-initialisés par rapport à la nouvelle orientation. Il est donc tout à fait possible de lancer un setContentView(R.layout.activity_main); pour réafficher l'écran correspondant.

Il sera possible d'effectuer certaines opérations par rapport au changement de configuration. newConfig précisant justement les modifications !

Par exemple

if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {...} ou avec Configuration.ORIENTATION_PORTRAIT, ...

Pour le clavier: if (newConfig.keyboardHidden == Configuration.KEYBOARDHIDDEN_NO) {...}

 

Exemple de code

L'idée est toute simple, montrer que les variables déclarées dans une activité ne sont pas perdues, d'ailleurs, on ne repassera pas par le onCreate. Que la ressource layout est initialisée comme il faut et que l'activité est bien informée du changement de la configuration.

Voici le MainActivity

et son layout

Et enfin, le fichier ManifestAndroid.xml correspondant: