Module de Programmation Android (LP PRISM AirFrance)

TD6 - Interfaces dynamiques

Les objectifs de ce TD sont : Pour cela, nous allons revenir sur le jeu "Click the button!", mais avec cette fois plusieurs fragments au lieu de plusieurs activités.

Mise en place

Commencer une nouvelle application, en choisissant cette fois Blank Activity with Fragment au lieu de Blank Activity, que l'on pourra par exemple nommer TD6Activity.

Observer le code de cette application: Par défaut, AndroidStudio utilise une ancienne bibliothèque de fragments, et non celle de la bibliothèque standard. Pour corriger cela, remplacer dans la liste d'importations de TD6ActivityFragment import android.support.v4.app.Fragment; par import android.app.Fragment;

Attachement du fragment au niveau Java

Pour l'instant, le fragment est attaché à l'activité TD6Activity lors de la création de celle-ci, et ne sera détaché que lors de sa destruction. Cela offre l'un des usages des fragments : le partage d'interfaces entre plusieurs activités. En revanche, cela ne permet pas d'avoir des interfaces dynamiques : le même fragment sera en place pendant toute la durée de l'activité.

Pour éviter cela, il faut attacher le fragment au niveau du code Java, et non dans l'interface XML de l'activité.

Attachement et détachement

Avec cette façon d'attacher le fragment, il est maintenant possible de le détacher et de l'attacher à nouveau, rendant ainsi l'interface plus dynamique.

Jeu "Click the button!"

Nous allons maintenant implanter notre jeu préféré au sein du fragment. Pour associer une méthode au clic sur un bouton dans un fragment, on ne peut pas utiliser l'attribut android:onClick comme on le fait lorsque le bouton est directement dans une activité. Il faut nécessairement passer par la méthode java correspondante void setOnClickListener (View.OnClickListener l) de la classe Button qui s'utilise comme suit:
  buttonClick.setOnClickListener(new View.OnClickListener() {
   public void onClick(View v) {
    // Action à effectuer
   }
  });
Le principe est de fournir une implantation de l'interface Java View.OnClickListener en implantant sa méthode void onClick (View v), qui correspond à la méthode qu'on associe usuellement à l'attribut android:onClick.

Interaction entre le fragment et l'activité

Le jeu n'est pas encore complet : à chaque fois que l'on a fait cinq clics, on gagne un niveau. On souhaite que le niveau soit toujours visible indépendemment du fragment, et donc soit un élément de l'interface de l'activité et non de celle du fragment. On va vouloir modifier cette zone de texte, non pas dans l'activité, mais dans le fragment qu'elle contient. On a ainsi mis à jour des objets de l'activité depuis le fragment. Le contraire n'est pas possible directement, mais il est possible d'appeler des méthodes du fragments (qui peuvent mettre à jour des objets de ce fragment) depuis l'activité. Remarque : On constate que ces interactions entre fragments et activités peuvent se faire en utilisant directement les objets ou méthodes de l'un dans l'autre. On rappelle que cela n'est pas possible pour l'interaction entre activités, pour lesquelles il faut nécessairement passer par des intentions.

À vous de jouer

  1. Ajouter à TD6Activity un deuxième fragment, qui sera également un objet de la classe TD6ActivityFragment (mais différent de frag). L'attacher au démarrage de l'activité.
  2. Ajouter un deuxième bouton "Attacher/Détacher" pour ce fragment. Factoriser le code au maximum et tester.
  3. Ajouter un deuxième bouton "Click the button!" au niveau de l'activité pour ce fragment. Factoriser le code au maximum et tester.
  4. Comment réagit le niveau aux clics sur les différents boutons ? Faire en sorte qu'on gagne un niveau à chaque fois que la somme des deux nombres de clics est multiple de 5.
    Remarque : on rappelle l'existence du mot-clé static...
  5. Observer le comportement de l'activité lorsqu'on tourne la tablette. Le corriger.

Retour à la page du cours