Nantes Université

Skip to content
Extraits de code Groupes Projets
avatar de l'utilisateur
Olivier STIERER rédigé
ac3aca1f
Historique

R4.11 TD 2 : Gestion des événements

Objectifs

  • gestion des événements

out

  • Générer des print dans la méthode onCreate() d'une activité
  • Visualiser ces affichages dans le Logcat

Log

Toast

https://kotlinlang.org/docs/java-interop.html#notation-for-platform-types

Premiers pas

  • Placer deux Button et un TextView dans l'écran d'une activité.
  • Utiliser la méthode findViewById() pour obtenir la référence d'un composant graphique.
  • Un clic sur le premier bouton affiche un message par Log et Toast
  • Un clic sur le deuxième bouton modifie le texte du TextView

Convertisseur de température

La base de l'application est fournie. Décompactez le fichier fourni et ouvrez le dossier obtenu depuis Android Studio.

Interface : vue

Le layout de la vue vous est fourni :

Modèle

Vous disposez d'une classe Temperature permettant de convertir des température de Celsius (C) à Fahrenheit (F):

°C = (°F - 32)/ 9 * 5
°F = (°C * 9 / 5) + 32 

source : https://fr.wikipedia.org/wiki/Degr%C3%A9_Fahrenheit#Conversion_en_degr.C3.A9s_Celsius

Gestion des événements : contrôleur

L'interface graphique est composée de deux ImageButton, deux TextEdit et deux SeekBar. Pour référencer un composant, une solution est le faire en tant qu'attribut déclaré lateinit :

private lateinit var truc : TextView

puis de l'initialiser après la mise en place de l'interface

setContentView(R.layout.activity_main)
truc = findViewById(R.id.truc)

Votre application gérera les événements suivants :

  • clic sur les ImageButton : conversion et affichage dans l'autre champs de texte (de celsius vers fahrenheit ou le contaire).
  • Clic sur ➀ : le contenu de ➂ est converti et affiché dans ➃.
  • Clic sur ➁ : le contenu de ➃ est converti et affiché dans ➂.
  • gain du focus sur les TextEdit (clic sur ➂ ou ➃) : reset du TextEdit
  • enfin, les SeekBar (➄ et ➅) permettent de choisir une température (reflétée dans les TextEdit). Les températures possibles vont de -100° à +60° Celsius (et l'équivalent en ° Fahrenheit).

Notes

La base de l'application est fournie. On cherche à visualiser des notes.

Interface : vue

Le layout de la vue vous est fourni :

Modèle

Votre modèle consistera en une liste de Note. Les classes Notes et Note sont fournies.

Gestion des événements

Votre application gérera les événements suivants :

  • le clic sur les boutons ➀ et ➁, avance et recule dans la liste des Note.
  • le clic sur le bouton ➂ permet de supprimer la note courante
  • les autres boutons sont pour l'instant inactifs.

Problème

  • Autoriser la rotation sur votre dispositif de test.
  • Démarrer votre application et supprimer des notes
  • Effectuer une rotation
  • Vous devriez constater que votre liste de notes s'est réinitialisée.

Un changement de configuration, comme un passage du mode portrait à paysage, nécessite de redessiner toute l'interface. Ceci est réalisé en détruisant puis recréant l'activité.

Solution

La classe ViewModel a été conçue pour avoir un cycle de vie différent de l'activité et conserver, même en cas de rotation, la référence sur le modèle.

  • Définir une sous classe XXXViewModel de androidx.lifecycle.ViewModel, par exemple NoteViewModel
  • Référencer dans cette classe le Modèle (la liste de Note)
  • Dans l'activité récupérer le ViewModel :
val mVm: XXXViewModel by viewModels()

Ceci fonctionne car la dépendance suivante a été ajoutée dans le fichier app/build.gradle :

implementation('androidx.activity:activity-ktx:1.6.1')

Ancienne syntaxe :

 val mVm: XXXViewModel = ViewModelProvider(this).get(XXXViewModel::class.java)
  • Le ViewModel n'est pas réinitialisé à chaque redémarrage de l'activité.
  • Tester !

https://developer.android.com/topic/libraries/architecture/viewmodel.html

Pour aller plus loin

  • gérer les événements touchés. Produire une sortie dans les logs. Tester avec une tablette.

Documentation : https://developer.android.com/training/gestures/detector.html