R4.11 TD 2 : Gestion des événements
Objectifs
- gestion des événements
out
- Générer des
print
dans la méthodeonCreate()
d'une activité - Visualiser ces affichages dans le
Logcat
Log
- Consulter la documentation de
android.util.Log
à l'url suivante : https://developer.android.com/reference/android/util/Log.html - Générer des logs dans la méthode
onCreate()
d'une activité - Visualiser les logs dans le
Logcat
Toast
- Consulter la documentation de
android.widget.Toast
à l'url suivante : https://developer.android.com/reference/android/widget/Toast.html - Utiliser la méthode
makeText(xxx).show()
pour faire afficher un message temporairement.
https://kotlinlang.org/docs/java-interop.html#notation-for-platform-types
Premiers pas
- Placer deux
Button
et unTextView
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
etToast
- 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 duTextEdit
- enfin, les
SeekBar
(➄ et ➅) permettent de choisir une température (reflétée dans lesTextEdit
). 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
deandroidx.lifecycle.ViewModel
, par exempleNoteViewModel
- 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