Aujourd’hui, nous allons voir comment gérer (conserver et restaurer) l’état des Activités dans Xamarin.Application Android afin de garder l’application cohérente et réactive pour les changements de configuration / état.

Table des matières

Pourquoi conserver et restaurer l’état de l’activité?

Comme je l’ai déjà décrit dans mon article sur les activités Android, le système d’exploitation peut réagir à certains changements d’état « constants” en appelant des méthodes de cycle de vie au cours de la vie de l’activité, qui peuvent être remplacées par le programmeur afin de prendre des actions supplémentaires. Cependant, certains comportements dans les applications Android peuvent modifier sa configuration, après quoi l’état de l’activité (par exemple: arrangement ou certains éléments de l’interface utilisateur ou les sélections de cases à cocher) peut être perdu s’il n’est pas géré correctement.

Pour vous donner un exemple réel: dans l’application MoneyBack, il y a un écran principal avec deux onglets. J’ai remarqué que lorsque le deuxième onglet est sélectionné:

MoneyBack – 2ème onglet sélectionné

et le périphérique est pivoté:

MoneyBack – 1er onglet sélectionné après la rotation

le premier onglet est sélectionné. L’utilisateur perd son entrée (sélection du 2ème onglet).

Le changement d’orientation de l’écran est l’une des raisons pour lesquelles nous devrions nous soucier de sauvegarder et de restaurer les états des activités.

Conserver les changements d’état – Onaveinstancestate()

Chaque Activité nous permet de remplacer la méthodeBundleaveinstancestate (Bundle outState), qui est appelée lorsque l’Activité en cours doit être tuée (par exemple lorsque l’orientation de l’écran de l’appareil change ou que l’Activité doit être tuée par Android pour libérer certaines ressources).

Veuillez ne pas le confondre avec les méthodes de cycle de vie d’activité (que j’ai déjà décrites ici), comme OnPause() ou OnStop() qui sont toujours appelées par le système d’exploitation lorsque une action particulière se produit. La méthode Onaveinstancestate() est généralement appelée après OnPause() et avant onstop(), mais ce n’est pas toujours le cas. Par exemple, il ne sera pas appelé du tout lorsque l’utilisateur reviendra d’ActivityB à ActivityA, car dans ce cas, ActivityB ne sera jamais tué. Plus de détails peuvent être trouvés dans la documentation officielle d’Android.

Onaveinstancestate() est appelé avec le paramètre Bundle fourni. Il représente un simple dictionnaire clé-valeur, qui est en outre sérialisé, il doit donc être utilisé pour stocker des valeurs simples comme des chaînes, des entiers, etc. Il existe d’autres structures et techniques pour stocker des données plus complexes sur les événements de changement d’état (voir le lien dans la section « Résumé” de cet article).

Afin d’enregistrer l’onglet actuellement sélectionné, nous pouvons implémenter la méthode comme suit:

void override void voidaveinstancestate(Bundle outState)

{

var tabSelectedPosition = ceci.Barre d’action.J’ai choisi l’index de navigation;

En dehors de l’État.PutInt(« selectedTabPosition », tabSelectedPosition);

base.Vous pouvez également utiliser la fonction rawaveinstancestate (outState);

}

pour afficher l’état Onaveinstancestate brut.cs hébergé avec ❤ by GitHub

Maintenant, chaque changement d’orientation de l’écran appellera cette méthode et l’index de l’onglet sélectionné sera enregistré dans le dictionnaire Bundle outState sous la touche « selectedTabPosition”.

Restauration des changements d’état – OnRestoreInstanceState()

Dès que l’activité considérée reprend vie (est en cours de reprise), la méthode OnRestoreInstanceState (Bundle savedInstanceState) est appelée par le système d’exploitation. Il ne sera appelé que s’il y a une instance enregistrée conservée en appelant la méthode beforeaveinstancestate() auparavant. Comme vous pouvez le voir, cette méthode est également livrée avec un paramètre Bundle, qui est le même dictionnaire sérialisé clé-valeur que nous avons utilisé pour enregistrer l’état de l’activité.

En cas de restauration de la sélection des onglets, nous pouvons implémenter cette méthode car le code suivant présente:

protected override void OnRestoreInstanceState(Bundle savedInstanceState)

{

base.OnRestoreInstanceState(savedInstanceState);

var previouslySelectedTabPosition = savedInstanceState.GetInt(« selectedTabPosition », 0);

this.ActionBar.SetSelectedNavigationItem(previouslySelectedTabPosition);

}

view raw OnRestoreInstanceState.cs hébergé avec ❤by GitHub

La variable previouslySelectedTabPosition sera initialisée avec la valeur entière du dictionnaire de Bundle enregistrée sous la clé ”selectedTabPosition », ou la valeur par défaut (0) si rien n’est enregistré pour la clé n’est trouvé.

REMARQUE: Le paramètre Bundle fourni dans OnRestoreInstanceState() est exactement le même que celui disponible dans la méthode OnCreate (Bundle bundle) appelée lors de la création de l’activité. Nous pourrions également y récupérer notre valeur enregistrée, mais dans de nombreux cas, la restauration de l’état (comme la sélection de l’onglet précédemment sélectionné) nécessite que certains éléments de l’interface utilisateur soient déjà initialisés, ce qui devrait être géré dans la méthode OnCreate() auparavant. Pour cette raison, je suggère plutôt de restaurer l’état de l’activité en utilisant OnRestoreInstanceState() en règle générale (bien sûr, il peut y avoir des cas exceptionnels 😉). OnRestoreInstanceState() sera toujours appelé après OnCreate().

De plus, si nous voulions utiliser le paramètre Bundle dans la méthode OnCreate(), nous aurions besoin de vérifier à chaque fois si bundle n’est pas NUL (car nous ne savons pas si bundleaveinstancestate() avait été appelé auparavant).

Par conséquent, le même onglet que précédemment est sélectionné même après la rotation de l’appareil sur l’activité principale de MoneyBack:

Onglet de maintien de l’argent sélectionné lors de la rotation

Changements d’état « automatiques” gérés par le système d’exploitation Android

Peut–être avez-vous remarqué dans votre application Android que tous les éléments de l’interface utilisateur ne doivent pas être gérés « manuellement” en implémentant les méthodes mentionnées ci-dessus pour enregistrer son état. Android effectue une sorte d’enregistrement et de restauration ”automatiques » des états des éléments d’interface utilisateur de base.

La règle ici est que tant que l’élément d’interface utilisateur (comme TextView ou Button) a son identifiant Android: défini.fichier de mise en page axml, le système d’exploitation gérera automatiquement les états de ces éléments (par exemple, le texte entré dans EditText).

Par exemple, pour EditText déclaré comme ça:

ses propriétés (en particulier sa propriété Text) seront automatiquement enregistrées et restaurées lors des changements d’orientation de l’écran.

Résumé

Nous avons vu comment gérer les changements d’état des activités Android causés par la modification de la configuration (par exemple, changement d’orientation de l’écran, Activité tuée par le système d’exploitation afin de libérer des ressources, etc.) en implémentant Onaveinstancestate() et OnRestoreInstanceState(), où nous avons ajouté et récupéré des données clé-valeur vers / à partir du dictionnaire sérialisé du bundle. Nous devons juste nous rappeler que ces méthodes ne sont pas toujours appelées (par exemple lors de la navigation entre les activités à l’aide du bouton « retour”), elles ne doivent donc être utilisées que pour certains types de changements d’état.

Nous avons également vu que les contrôles d’interface utilisateur avec leur identifiant Android: défini dans les fichiers de mise en page ont leurs états résistants aux modifications de configuration (gérés automatiquement par le système d’exploitation Android).

Le dictionnaire bundle est sérialisé pour de meilleures performances et une meilleure utilisation de la mémoire, de sorte que seules les valeurs typées simples doivent y être stockées (comme des chaînes ou des entiers). Afin de stocker des données plus complexes, Android offre différentes possibilités de gestion (par exemple en utilisant OnRetainNonConfigurationInstance).

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée.