Cours-Programmation Mobile Avec Jetpack Compose
Cours-Programmation Mobile Avec Jetpack Compose
DÉVELOPPEMENT
D’APPLICATIONS
MOBILES
GLO 418 / IC4
Année académique : 2023-2024
UMa
Touza Isaac
ENSPM
isaac_touza@[Link]
INFOTEL
Informations générales
• Code UE : GLO418
• Intitulé de L’UE : Développement d’Applications
Mobile
• Crédit : 3
• Durée : 45h
❑ CM : 10 h
❑ TP: 15h
❑ TPE: 5h
❑ TD : 15h
• Evaluations :
❑ CC (théorique ou pratique): 2h
❑ Examen (théorique ou pratique) : 2h
❑ Rattrapage (théorique ou pratique): 2h 2
• Références :
❑ Antonio Leiva, Kotlin for Android Developers. Learn Kotlin the easy
way while developing an Android App. 22017-06-20
❑ Pierre Nerzic , Programmation mobile avec Android. IUT de
Lannion. février-mars 2021.
❑ Tutorials Point (I) Pvt. Ltd, Kotlin. 2019
❑ Peter Späth, Pro Android with Kotlin. Developing Modern Mobile
Apps. Leipzig, Germany ISBN-13 (pbk): 978-1-4842-3819-6.
3
Objectifs du cours
Objectif général:
Apprendre à développer des applications mobiles avec Kotlin.
Objectifs spécifiques :
• Maîtriser les bases de Kotlin
• Comprendre la Programmation Orientée Objet avec Kotlin
• Mettre en œuvre la programmation fonctionnelle
• S'initier aux applications Android sous Kotlin
• Utiliser efficacement jetpack compose
• Intégrer le langage Kotlin dans un projet Java existant
4
Près-requis et consignes
Près requis :
• Maitriser un langage de programmation orienté
objet (Java, C#, C++)
• Programmer en HTML
Consignes :
• Assister à tous les cours
• Etre attentifs et actifs pendant le cours
• Faire tous les exercices de TD et TP
• Refaire plusieurs fois les exercices d’applications
• Ne manquez jamais un TP
5
Recommandations
Outils logiciels:
• JDK et JRE
• Android studio
• IntelliJ IDEA
Plateformes
• YouTube
• Stackoverflow
• GitHub
6
Plan du cours
Séance 1 : Environnement de développement
Séance 2 : Introduction au langage Kotlin
Séance 3 – 6 : Programmation impérative avec kotlin
❑ Conception d’interface d’utilisateur
❑ Vie d’une application
❑ Liste
❑ Ergonomie
Séance 7 – 12 : Jetpack compose
❑ Introduction
❑ Les bases du compose
❑ Gestion des données avec compose
❑ Widgets, Interfaces personnalisées et composables avancées
❑ La navigation
❑ Test et gestion de configuration
Séance 13 : SQLite
Séance 14 : Firebase 7
SÉANCE 1
ENVIRONNEMENT
DE
DÉVELOPPEMENT
Cette matière présente la programmation d’applications natives sur Android avec
Kotlin. Il y aura 14 semaines de cours, chacune comptant 2h CM et 3h TP.
Cette semaine nous allons découvrir l’environnement de développement Android :
▪ Le SDK Android et Android Studio
▪ Création d’une application simple
▪ Communication avec un smartphone ou une tablette
9
Android: Historique et définition
❑ Né en 2004, racheté par Google en 2005, publié en 2007, version 1.5
❑ De nombreuses versions depuis. On en est à la version 14 (2023) et l’API
34.
❑ La version 13 est le numéro pour le grand public, et les versions d’API
sont pour les développeurs. Exemples:
▪ 4.1 JellyBean = API 16,
▪ 6.x Marshmallow = API 23,
▪ 9.x Pie = API 28
11
Distribution des versions d’API
12
Distribution des versions d’API
13
[Link]
Distribution des versions d’API
Remarques :
❑ Chaque API apporte des fonctionnalités supplémentaires. Il y a
compatibilité ascendante. Certaines fonctionnalités deviennent
dépréciées au fil du temps, mais restent généralement
disponibles.
❑ On souhaite toujours programmer avec la dernière API
(fonctions plus complètes et modernes), mais les utilisateurs
ont souvent des smartphones plus anciens, qui n’ont pas cette
API.
❑ Or Android ne propose aucune mise à jour majeure. Les
smartphones restent toute leur vie avec l’API qu’ils ont à la
naissance.
❑ Les développeurs doivent donc choisir une API qui correspond
à la majorité des smartphones existant sur le marché.
14
Applications Android.
Actuellement, les applications sont :
• « natives », c’est à dire programmées en Java, C++, Kotlin,
compilées et fournies avec leurs données sous la forme d’une
archive Jar (fichier APK). C’est ce qu’on étudiera ici.
• « web app », c’est une application pour navigateur internet,
développée en HTML5, CSS3, JavaScript, dans un cadre logiciel
(framework) tel que [Link], Angular ou React.
• « hybrides », elles sont développées dans un framework
comme Ionic, Flutter, React Native. . . Ces frameworks font
abstraction des particularités du système : la même application
peut tourner à l’identique sur différentes plateformes (Android,
iOS, Windows, Linux. . . ).
NB : La charge d’apprentissage est la même.
15
Applications Android.
Actuellement, les applications sont :
• « natives », c’est à dire programmées en Java, C++, Kotlin,
compilées et fournies avec leurs données sous la forme d’une
archive Jar (fichier APK). C’est ce qu’on étudiera ici.
• « web app », c’est une application pour navigateur internet,
développée en HTML5, CSS3, JavaScript, dans un cadre logiciel
(framework) tel que [Link], Angular ou React.
• « hybrides », elles sont développées dans un framework
comme Ionic, Flutter, React Native. . . Ces frameworks font
abstraction des particularités du système : la même application
peut tourner à l’identique sur différentes plateformes (Android,
iOS, Windows, Linux. . . ).
NB : La charge d’apprentissage est la même.
16
Applications Android.
Une application native Android est composée de :
▪ Code sources (Java ou Kotlin) compilés pour une machine
virtuelle appelée « ART», amélioration de l’ancienne machine «
Dalvik » (versions ≤ 4.4).
▪ Fichiers appelés ressources :
- format XML : interface, textes. . .
- format PNG : icônes, images. . .
▪ Manifeste = description du contenu du logiciel
- version minimale du smartphone,
- fichiers présents dans l’archive avec leur signature,
- demandes d’autorisations, durée de validité, etc.
Tout cet ensemble est géré à l’aide d’un IDE (environnement de
développement) appelé Android Studio qui s’appuie sur un ensemble
logiciel (bibliothèques, outils) appelé SDK Android.
17
Android Studio
Le logiciel Android Studio est un logiciel de programmation
(IDE) des applications mobiles.
Elle offre :
❑un éditeur de sources et de ressources
❑des outils de compilation : gradle
❑ des outils de test et de mise au point
Pour commencer à créer des applications mobiles, il faut
installer Android Studio selon la procédure expliquée via
cette adresse :
[Link]
18
SDK
Le Software Development Kit (SDK) contient :
❖Les librairies Java pour créer des logiciels
❖Les outils de mise en boîte des logiciels
❖AVD : un émulateur de tablettes pour tester les applications
❖ADB : un outil de communication avec les vraies tablettes
L’installation de SDK, se fait soit automatiquement avec Android
Studio, soit faire une installation personnalisée. En général, vous
pouvez choisir ce que vous voulez ajouter au SDK (version des
librairies, versions des émulateurs de smartphones), à l’aide du
SDK Manager. C’est le gestionnaire du SDK, une
application qui permet de choisir les composants à
installer et mettre à jour.
19
SDK
20
SDK
Le gestionnaire permet de
✓ choisir les versions à installer, ex. : Android 11 (API 30),
Android 7.0 (API 24) , …
✓ Choisir celles qui correspondent aux tablettes qu’on vise, mais
tout n’est pas à installer : il faut cocher Show Package
Details, puis choisir élément par élément. Seuls ceux-là sont
indispensables :
❑ Android SDK Platform
❑ Intel x86 Atom_64 System Image
Le reste est facultatif (Google APIs, sources, exemples et docs)
21
SDK
Le dossier SDK contient de sous-dossiers suivants:
• SDK Tools : indispensable, contient le gestionnaire,
• SDK Platform-tools : indispensable, contient adb,
• SDK Platform : indispensable, contient les librairies,
• System images : pour créer des AVD,
• Android Support : divers outils pour créer des applications,
• Exemples et sources.
22
Première application Android
23
Première application Android
24
Première application Android
25
Première application Android
26
SDK
L’assistant a créé de nombreux éléments visibles dans la colonne
de gauche de l’IDE :
• manifests : description et liste des classes de l’application
• java : les sources, rangés par paquetage,
• res : ressources = fichiers XML et images de l’interface, il y a
des sous-dossiers :
✓ layout : interfaces (disposition des vues sur les
✓ écrans)menu : menus contextuels ou d’application
✓ mipmap et drawable : images, icônes de l’interface
✓ values : valeurs de configuration, textes. . .
• Gradle scripts : c’est l’outil de compilation du projet.
NB: ne pas chercher à tout comprendre cette semaine 27
Structure d’un projet Android
28
Editeurs d'Android studio
29
Editeurs d'Android studio
30
Gradle
❑ Gradle est un outil de construction de projets comme Make
(projets C++ sur Unix), Ant (projets Java dans Eclipse) et
Maven.
❑ De même que make se sert d’un fichier Makefile, Gradle se
sert de fichiers nommés [Link] pour construire le
projet.
On distingue deux [Link] :
• un script [Link] dans le dossier racine du projet. Il
indique quelles sont les dépendances générales (noms des
dépôts Maven contenant les librairies utilisées).
• un dossier app contenant l’application du projet.
• un script [Link] dans le dossier app pour compiler
l’application 31
Gradle
Remarque:
Chaque modification d’une source ou d’une ressource fait
reconstruire le projet (compilation des sources, transformation
des XML et autres). C’est automatique.
32
Utilisation des bibliothèques
Certains projets font appel à des bibliothèques externes. On les
spécifie dans le [Link] du dossier app, dans la zone
dependencies :
33
Utilisation des bibliothèques
Certains projets font appel à des bibliothèques externes. On les
spécifie dans le [Link] du dossier app, dans la zone
dependencies :
35
Exécution de l’application
L’assistant de création de tablette demande :
• Modèle de tablette ou téléphone à simuler,
• Version du système Android,
• Orientation et densité de l’écran
• Options de simulation :
✓ Snapshot : mémorise l’état de la machine d’un
lancement à l’autre, mais exclut Use Host
GPU,
✓ Use Host GPU : accélère les dessins 2D et 3D
à l’aide de la carte graphique du PC.
• Options avancées :
✓ RAM : mémoire à allouer, mais est limitée par
votre PC,
✓ Internal storage : capacité de la flash interne,
✓ SD Card : capacité de la carte SD simulée
supplémentaire (optionnelle). 36
Exécution de l’application
37
Création d’un paquet installable
Un paquet Android est un fichier .apk. C’est une archive signée
(authentifiée) contenant les binaires, ressources compressées et
autres fichiers de données.
La création est relativement simple avec Studio :
1. Menu contextuel du projet Build..., choisir Generate Signed
APK,
2. Signer le paquet à l’aide d’une clé privée,
3. Définir l’emplacement du fichier .apk.
38
Création d’un paquet installable
39
Création d’un paquet installable
40
Et Voilà !
C’est fini pour cette semaine, rendez-vous la séance prochaine pour
le cours sur Kotlin.
41
SÉANCE 2
KOTLIN
42
Cette semaine nous allons découvrir le langage Kotlin :
▪ Maîtriser les bases de Kotlin
▪ Comprendre la Programmation Orientée Objet avec Kotlin
▪ Mettre en œuvre la programmation fonctionnelle
43
Présentation du langage Kotlin
• Kotlin est un langage de programmation orienté objet et
fonctionnel, avec un typage statique qui permet de compiler
pour la machine virtuelle Java, JavaScript, et vers plusieurs
plateformes en natif grâce à LLVM (Low Level Virtual Machine
en français : « machine virtuelle de bas niveau).
• Conçu Par : JetBrains
• Date de première version : 22 juillet 2011
• Dernière version : 1.9.20 (29 septembre 2022)
• Licence : Licence Apache version 2.0
• Paradigme : Objet, fonctionnel
• Site web : [Link]
44
Avantages de Kotlin
45
Pourquoi une application mobile
avec Kotlin ?
46
Pourquoi une application mobile
avec Kotlin ?
47
Exécuter un script kotlin
48
Exécuter un script kotlin
49
Kotlin: Déclaration de variable
Kotlin utilise deux mots clés différents pour déclarer des variables
: val et var.
❑ Utilisez val pour une variable dont la valeur ne change jamais
(constante). Vous ne pouvez pas réattribuer une valeur à une
variable déclarée à l'aide de val.
❑ Utilisez var pour une variable dont la valeur peut changer.
50
Kotlin: Inférence de type
Dans l'exemple suivant, languageName est déduit en tant que
String. Vous ne pouvez donc pas appeler des fonctions qui ne
font pas partie de la classe String :
51
Kotlin: Sécurité nulle
Dans certaines langues, une variable de type de référence peut être
déclarée sans valeur explicite initiale. Dans ces cas, les variables
contiennent généralement une valeur nulle. Par défaut, les variables
Kotlin ne peuvent pas contenir de valeurs nulles. Cela signifie que
l'extrait suivant n'est pas valide :
Pour qu'une variable puisse contenir une valeur nulle, elle doit être de
type nullable. Vous pouvez spécifier qu'une variable nullable en
ajoutant le suffixe ? à son type, comme illustré dans l'exemple suivant
:
52
Expressions conditionnelles
Kotlin propose plusieurs méthodes permettant
d'implémenter une logique conditionnelle. La plus
courante est l'instruction if-else.
53
Expressions conditionnelles
Pour éviter cette répétition, Kotlin permet d'utiliser
des expressions conditionnelles.
L'exemple peut être réécrit comme suit :
54
Expressions conditionnelles
Lorsque la complexité de votre instruction conditionnelle
augmente, vous pouvez envisager de remplacer votre
expression if-else par une expression when, comme illustré
dans l'exemple suivant :
55
Expressions conditionnelles
Exercice :
Ecrire un programme Kotlin qui affiche la mention de
l’étudiant en fonction de sa moyenne.
• 10 <= Moyenne < 12 : Passable
• Moyenne > 14 : Très Bien
• Moyenne = 20 : Parfait
NB: utiliser l’expression when.
56
Les boucles en kotlin
57
Les boucles en kotlin
58
Les boucles en kotlin
60
Les tableaux en kotlin
62
Les tableaux en kotlin
63
Les tableaux en kotlin
On peut parcourir un tableau de deux façons:
❑ Utilisation de la boucle “for”.
var TableauEntier: IntArray=intArrayof(2,10,11,33)
for (I in TableauEntier) {
TableauEntier[i].toString()
}
❑ la methode forEach()
var TableauEntier: IntArray=intArrayof(2,10,11,33)
[Link]{ it: Int
[Link]()
}
64
Les fonctions en kotlin
• Pour déclarer une fonction, utilisez le mot clé fun suivi
du nom de la fonction.
• Ensuite, définissez les types d'entrées que votre fonction
reçoit, le cas échéant, et déclarez le type de sortie
qu'elle renvoie.
• Le corps d'une fonction est l'endroit où vous définissez
les expressions appelées lorsque votre fonction est
appelée.
fun NomFonction (arguments et types ): type_retour {
Votre code ici
return valeur
}
65
Les fonctions en kotlin
• Pour déclarer une fonction, utilisez le mot clé fun suivi
du nom de la fonction.
• Ensuite, définissez les types d'entrées que votre fonction
reçoit, le cas échéant, et déclarez le type de sortie
qu'elle renvoie.
• Le corps d'une fonction est l'endroit où vous définissez
les expressions appelées lorsque votre fonction est
appelée.
fun NomFonction (arguments et types ): type_retour {
Votre code ici
return valeur
}
66
Les fonctions en kotlin
Exercice :
1. Ecrire une fonction Kotlin qui calcule la moyenne des
éléments d’un tableau de taille N=50
67
PROGRAMMATION ORIENTEE
OBJET EN KOTLIN
68
Les classes en Kotlin
Terminologie
69
Les classes en Kotlin
Terminologie
70
Les classes en Kotlin
Définition d’une classe en Kotlin
La définition de classe commence par le mot clé class, suivi d'un nom
et d'une série d'accolades.
71
Les classes en Kotlin
Définition d’une classe en Kotlin
72
Les classes en Kotlin
Propriétés d'une classe
74
Les classes en Kotlin
Les méthodes de classe
75
Les classes en Kotlin
Appel d’une méthode sur un objet
76
Les classes en Kotlin
Appel d’une méthode sur un objet
Remarque :
Le principe d’une classe est d’encapsuler un ensemble de données qui
ont un certain lien entre elles, nous allons avoir besoin d’assesseurs
(getters) pour y avoir accès, et de mutateurs (setters) pour les modifier.
En Kotlin, vous n’aurez pas besoin de les déclarer explicitement. Ils
seront "générés" automatiquement grâce aux mots-clés val et var
indiqués avant chaque nom de propriété dans le constructeur de la
classe :
• val : La propriété sera immuable, vous ne pourrez donc pas la
modifier. Kotlin générera alors pour vous uniquement un assesseur.
• var : La propriété sera muable, vous pourrez la modifier. Kotlin
générera alors pour vous un assesseur et un mutateur.
Plus besoin d’utiliser les préfixes get et set devant le nom d'une
propriété : appelez directement la propriété par son nom !
77
Les classes en Kotlin
Constructeurs d'une classe
78
Les classes en Kotlin
Constructeurs d'une classe
79
Les classes en Kotlin
Constructeurs d'une classe
80
Les classes en Kotlin
Constructeurs d'une classe
81
Les classes en Kotlin
Constructeurs d'une classe
82
Les classes en Kotlin
Constructeurs d'une classe
85
Les classes en Kotlin
Relation entre les classes
Une sous classe peut posséder ses propres méthodes pouvant portés les
mêmes noms que celles de la superclasse. Pour ce faire :
• Dans le corps de la super-classe, ajoutez un mot clé open avant le
mot clé fun de chaque méthode :
86
Les classes en Kotlin
Relation entre les classes
87
Les classes en Kotlin
Relation entre les classes
88
Les classes en Kotlin
Modificateurs de visibilité
92
Les classes en Kotlin
Modificateurs de visibilité
93
Les classes en Kotlin
Exercice :
- Ecrire un programme qui définit une classe Forme
avec un constructeur qui donne la valeur de la
hauteur(y) et de la largeur (x).
- Définir deux sous classes Rectangle et Triangle,
puis donner dans ces deux sous classes la méthode
area() qui calcule l’aire.
- Dans le programme principale main(), définissez un
triangle et un rectangle , puis appelez la fonction
area() dans ces deux variables.
94
Et Voilà !
C’est fini pour cette semaine, rendez-vous la séance prochaine pour
le cours sur les interfaces de l’utilisateur.
95
PROGRAMMATION
IMPÉRATIVE
KOTLIN + XML
96
SÉANCE 3
CONCEPTION
D’INTERFACES
D’UTILISATEUR
97
Le cours de cette semaine explique la création d’interfaces utilisateur :
• Activités
• Relations entre un source kotlin et des ressources
• Layouts et vues
On ne s’intéresse qu’à la mise en page. L’activité des interfaces sera étudiée la
semaine prochaine.
98
Présentation des concepts
Composition d’une application
99
Présentation des concepts
Création d’une interface
100
Présentation des concepts
Création d’un écran
Chaque écran est géré par une instance d’une sous-classe de Activity
que vous programmez. Il faut au moins surcharger la méthode
onCreate selon ce qui doit être affiché sur l’écran :
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
[Link](savedInstanceState)
setContentView([Link].activity_main)
}
}
101
Les ressources
Définition
❑ Les ressources sont tout ce qui n’est pas programme dans une
application.
❑ Dans Android, ce sont les textes, messages, icones, images, sons,
interfaces, styles, etc.
Comme il va y avoir de très nombreux identifiants dans une application :
✓ chaque vue possède un identifiant (si on veut)
✓ chaque image, icone possède un identifiant
✓ chaque texte, message possède un identifiant
✓ chaque style, theme, etc. etc.
Ils ont tous été regroupés dans une classe spéciale appelée R
Cette classe R est générée automatiquement par ce que vous mettez
dans le dossier res : interfaces, menus, images, chaînes. . . Certaines de
ces ressources sont des fichiers XML, d’autres sont des images PNG.
102
Les ressources
Rappel sur la structure d’un fichier XML
103
Les ressources
Ressources de type chaînes
104
Les ressources
Ressources de type chaînes
105
Les ressources
Ressource de type texte
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/cours" />
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Cours Dev App Mob" />
106
Les ressources
Ressource de type image
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/logo_skool"
android:contentDescription="@string/app_name"
/>
❑ La notation @drawable/nom référence l’image portant ce nom dans
l’un des dossiers.
❑ NB: les dossiers res/mipmaps-* contiennent la même image à des
définitions différentes, pour correspondre à différents téléphones et
tablettes. Ex: mipmap-hdpi contient des icônes en 72x72 pixels.
107
Les ressources
Ressource de type tableau de chaine
108
Les ressources
Ressource de type tableau de chaine
109
Mise en page (layouts)
Structure d’une interface Android
110
Mise en page (layouts)
Arbre de vue
111
Mise en page (layouts)
Arbre de vue
112
Mise en page (layouts)
Ressource de type Layout
113
Mise en page (layouts)
Identifiant et vues
Lorsque l’application veut manipuler l’une de ses vues, elle doit utiliser
[Link].
La notation @+id/nom définit un identifiant pour une vue.
Exemple :
Avec la définition suivante dans res/layout/[Link] :
<LinearLayout ...>
<TextView
android:id="@+id/message"
android:text="@string/bonjour" />
</LinearLayout>
var tv = findViewById<TextView>([Link])
114
Mise en page (layouts)
Identifiant et vues
Remarques :
Dans les fichiers [Link], il y a deux notations à ne pas confondre :
▪ @+id/nom pour définir (créer) un identifiant
▪ @id/nom pour référencer un identifiant déjà défini ailleurs
Exemple, le Button btn se place sous le TextView titre :
<RelativeLayout xmlns:android="..." ... >
<TextView ...
android:id="@+id/titre"
android:text="@string/titre" />
<Button ...
android:id="@+id/btn"
android:layout_below="@id/titre"
android:text="@string/ok" />
</RelativeLayout>
115
Mise en page (layouts)
Paramètres de positionnement
La plupart des groupes utilisent des paramètres de taille et de placement
sous forme d’attributs XML. Par exemple, telle vue à droite de telle autre,
telle vue la plus grande possible, telle autre la plus petite. Ces paramètres
sont de deux sortes :
❑ Ceux qui sont obligatoires pour toutes les vues :
▪ android:layout_width : largeur de la vue
▪ android:layout_height : hauteur de la vue
Ils peuvent valoir :
▪ "wrap_content" : la vue prend la place minimale
▪ "match_parent" : la vue occupe tout l’espace restant
▪ "valeurdp" : une taille fixe, ex : "100dp" mais c’est peu
recommandé, sauf 0dp pour un cas particulier.
Les dp sont une unité de taille indépendante de l’écran. 100dp font 100
pixels sur un écran de 160 dpi tandis qu’ils font 200 pixels sur un écran
320 dpi 116
Mise en page (layouts)
Paramètres de positionnement
117
Mise en page (layouts)
Autres paramètres géométriques
118
Mise en page (layouts)
Groupes des vues LinearLayout
<Button
android:text="Annuler"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout> 119
Mise en page (layouts)
Groupes des vues LinearLayout
120
Mise en page (layouts)
Groupes des vues TableLayout
<TableRow>
<vue 2.1 .../>
<vue 2.2 .../>
</TableRow>
<TableLayout>
- Les <TableRow> n’ont aucun attribut.
- Ne pas spécifier android:layout_width dans les vues d’un TableLayout, car
c’est obligatoirement toute la largeur du tableau. Seul la balise <TableLayout>
exige cet attribut. 121
Mise en page (layouts)
Groupes des vues RelativeLayout
Vue Rôle
123
Mise en page (layouts)
Arbre de vue
124
Et Voilà !
C’est fini pour cette semaine, rendez-vous la séance prochaine pour
le cours sur Vie d’une application.
125
SEMAINE 4
VIE D’UNE
APPLICATION
126
Le cours de cette semaine concerne la vie d’une application :
• Applications et activités, manifeste
• Cycles de vie
• Vues, événements et écouteurs.
127
Application et activités
Présentation
129
Application et activités
Démarrage d’une activité et Intents
130
Application et activités
Démarrage d’une activité et Intents
132
Application et activités
Démarrage d’une activité et Intents
133
Application et activités
Les autorisations d’une application
134
Application et activités
Fonctionnement d’une application
135
Application et activités
Navigation entre deux activités
136
Application et activités
Terminaison d’une activité
137
Application et activités
Transport d’informations dans un Intent
138
Application et activités
Extractions d’informations dans un Intent
139
Application et activités
Contexte d’application
140
Activités
Présentation
141
Activités
Cycle de vie d’une activité
142
Activités
Événements de changement d’état
143
Activités
Squelette d’une activité
144
Vues et activités
Obtention des vues
145
Vues et activités
Propriétés des vues
La plupart des vues ont des setters et getters Kotlin pour leurs
propriétés XML. Par exemple TextView.
En XML :
<TextView
android:id="@+id/PwdForgetId"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Mot de passe oublié ?"
/>
En Kotlin
val text_pwd: TextView = findViewById([Link]. PwdForgetId)
text_pwd.text ="Mot de passe oublié ?"
146
Vues et activités
Actions de l’utilisateur
Il y’a deux façons de définir l’action d’un utilisateur sur une vue:
❑ on peut procéder directement dans le fichier xml de la vue
en insérant l’attribut onClick()
148
Vues et activités
Actions de l’utilisateur
onValider()
}
)
149
Vues et activités
Actions de l’utilisateur
150
Vues et activités
Actions de l’utilisateur
Exemple :
Exemple :
class HomeActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
[Link](savedInstanceState)
setContentView([Link].activity_home)
[Link](this)
}
fun OnClickListener(v:View){
Dans le cas où le même
when ([Link]) {
écouteur est employé [Link] -> {
pour plusieurs vues, il supprimer()
faut les distinguer en true
se basant sur leur }
identifiant obtenu avec [Link] -> {
Id : modifier()
true
}
else -> {
// autres methodes
true
}
}
}
153
Vues et activités
Actions de l’utilisateur
[Link](this::OnBtnClick)
}
}
La syntaxe this::nom_methode est une simplification de
l’expression lambda (params) -> nom_methode(params) 154
Exercice
Description:
Cet exercice est une simple application Android avec trois
activités, la première activité est l'activité principale avec deux
boutons. Bouton 1 : vous amène à l'activité B lorsque vous cliquez
dessus. Bouton 2 : vous amène à l'activité C lorsque vous cliquez
dessus.
Activité B : est la page contenant un formulaire de connexion
destiné à collecter les informations suivantes: login, mot de passe
et contient deux boutons (connexion et annuler). En cliquant sur
le bouton connexion , l’utilisateur est redirigé vers la page A en
affichant le message « Connexion reussite » si les informations ne
sont pas vides. Sinon afficher un message pour lui demander de
renseigner les informations
L'activité C est votre profil, elle contient une ImageView qui
devrait afficher votre photo, TextViews indiquant votre nom,
piste, pays, e-mail et numéro de téléphone. 155
Exercice
156
Et Voilà !
C’est fini pour aujourd’hui. C’est assez pour cette semaine, rendez-
vous la semaine prochaine pour un cours sur les applications listes.
157
SÉANCE 5
APPLICATION
LISTE
158
Durant cette semaine prochaine, nous allons nous intéresser aux
applications de gestion d’une liste d’items.
• Stockage d’une liste
• Affichage d’une liste, adaptateurs
• Consultation et édition d’un item
159
Présentation
Principe général
160
Présentation
Principe général
Définition
Android ListView est une vue utilisée pour afficher les
éléments d'un tableau sous forme de liste défilante.
161
Présentation
Principe général
ArrayList ListView
RecyclerView
163
Présentation
Représentation des données initiales
<resources>
<string-array name="Noms">
<item>Jean</item>
<item>Abbas</item>
...
</string-array>
<integer-array name="Age">
<item>18</item>
<item>108</item>
...
</integer-array>
</resources>
166
Présentation
Représentation des données initiales dans les ressources
<[Link]
xmlns:android="[Link]
android:id="@+id/recycler"
android:layout_width="match_parent"
android:layout_height="match_parent" />
168
Adaptateurs et ViewHolders
Relations entre la vue et les données
169
Adaptateurs et ViewHolders
Adaptateur pour une liste simple
170
Adaptateurs et ViewHolders
Adaptateur pour une liste simple
171
Adaptateurs et ViewHolders
Adaptateur pour une liste simple
Exercice
Créer une application Android qui affiche la liste des 10
pays africains de votre choix.
172
Adaptateurs et ViewHolders
RecyclerView
Définition
RecyclerView est un widget d'affichage de liste avancé
disponible dans la bibliothèque de support d'Android. Il
permet de gérer de grandes quantités de données de
manière efficace en réutilisant les éléments de la liste qui
ne sont plus visibles pour économiser les ressources de la
mémoire.
Il offre une flexibilité et une personnalisation accrues par
rapport à la ListView, qui était le widget d'affichage de
liste standard dans les versions antérieures d'Android. Le
RecyclerView peut être utilisé pour afficher une liste
verticale, horizontale ou en grille, avec des mises en forme
personnalisées pour chaque élément de la liste.
173
Adaptateurs et ViewHolders
RecyclerView
175
Adaptateurs et ViewHolders
Adaptateur pour une liste personnalisée : RecyclerView
177
Adaptateurs et ViewHolders
La mise en page
179
Adaptateurs et ViewHolders
ViewHolder
180
Adaptateurs et ViewHolders
ViewHolder
class PlanetAdapter(private val planets: List<Planet>) :
[Link]<[Link]>() {
182
Adaptateurs et ViewHolders
Définition de l’adaptateur
Exercice
Refaire la liste de l’application précédente, on insérant
cette fois ci dans la liste le nom du pays suivi de son
drapeau et ainsi que sa zone. L’exemple est donné ci-
dessous:
Cameroun
Afrique centrale
183
Actions sur la liste
Clic sur un élément
186
Actions sur la liste
Définition d’un écouteur de clic
187
Actions sur la liste
Définition d’un écouteur de clic
188
Actions sur la liste
Définition d’un écouteur de clic
Exercice
Modifier la liste précédente de telle sorte que le nom du
pays et son numéro dans la liste puisse etre afficher à
l’utilisateur après avoir cliqué dessus.
189
Ouf, c’est fini !
C’est tout pour cette séance. La séance prochaine nous parlerons des
menus, dont les menus contextuels qui apparaissent quand on clique
longuement sur un élément d’une liste, dialogues et fragments
190
SÉANCE 6
ERGONOMIE
191
Le cours de cette séance concerne l’ergonomie d’une application
Android.
• Menus et barre d’action
• Pop-up : messages et dialogues
• Activités et fragments
• Préférences (pour info)
192
Barre d’action et menus
Barre d’action
193
Barre d’action et menus
Le menu
194
Barre d’action et menus
Le menu
196
Barre d’action et menus
Le menu : les icones
197
Barre d’action et menus
Les écouteurs pour afficher les menus
198
Barre d’action et menus
Réactions aux sélections d’items
199
Barre d’action et menus
Réactions aux sélections d’items
class MainActivity : AppCompatActivity() {
override fun onCreateOptionsMenu(menu: Menu): Boolean {
// Inflate the menu; this adds items to the action bar if it is present.
[Link]([Link].main_menu, menu)
return true
}
override fun onOptionsItemSelected(item: MenuItem): Boolean {
// Handle item selection
return when ([Link]) {
[Link].menu_item_1 -> {
// Action to perform when menu item 1 is selected
true
}
[Link].menu_item_2 -> {
// Action to perform when menu item 2 is selected
true
}
else -> [Link](item)
}
}
} 200
Barre d’action et menus
Menus en cascade
201
Barre d’action et menus
Menus en cascade
<menu xmlns:android="[Link]
<item
android:id="@+id/menu_item_1"
android:title="Menu Item 1"
android:icon="@drawable/ic_menu_item_1"
android:showAsAction="ifRoom">
<menu>
<item
android:id="@+id/submenu_item_1"
android:title="Submenu Item 1"
android:icon="@drawable/ic_submenu_item_1" />
<item
android:id="@+id/submenu_item_2"
android:title="Submenu Item 2"
android:icon="@drawable/ic_submenu_item_2" />
</menu>
</item>
<item
android:id="@+id/menu_item_2"
android:title="Menu Item 2"
android:icon="@drawable/ic_menu_item_2"
android:showAsAction="ifRoom" />
</menu>
202
Barre d’action et menus
Menus contextuels
203
Barre d’action et menus
Menus contextuels
[Link] {
[Link]()
true
205
}
Barre d’action et menus
Menus contextuels
206
Annonces et dialogues
Les annonces
207
Annonces et dialogues
Les annonces
208
Annonces et dialogues
Les dialogues
209
Annonces et dialogues
Les dialogues
212
Annonces et dialogues
Les dialogues
return view
}
} 213
Annonces et dialogues
Les dialogues
Remarque:
214
Les fragments
Présentation
215
Les fragments
Création de fragments en kotlin
216
Les fragments
Cycle de vie des fragments
217
Les fragments
Intégration de fragment à une activité
Pour ajouter un fragment à une activité hôte, vous devez ajouter
un FrameLayout à votre layout d'activité pour contenir le
fragment, puis utiliser FragmentManager pour ajouter le fragment à
ce conteneur. Par exemple :
<FrameLayout
android:id="@+id/fragment_container"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
[Link](savedInstanceState)
setContentView([Link].activity_main)
// Ajouter le fragment
[Link]()
.add([Link].fragment_container, MyFragment())
.commit()
}
218
}
Les fragments
Communication entre Activité et Fragments
1. Utilisation de l'interface :
Vous pouvez créer une interface dans votre fragment et
implémenter cette interface dans votre activité. Ensuite, vous
pouvez appeler la méthode de l'interface depuis votre fragment
pour communiquer avec votre activité.
219
Les fragments
Communication entre Activité et Fragments
Dans le fragment
interface MyListener {
fun onButtonClick()
}
fun onButtonClicked() {
listener?.onButtonClick()
}
}
220
Les fragments
Communication entre Activité et Fragments
Dans l’activité
class MyActivity : AppCompatActivity(), [Link] {
221
Les fragments
Communication entre Activité et Fragments
222
Préférences d’application
Présentation
226
Préférences d’application
création et accès aux préférences
227
Préférences d’application
Stockage des entiers, chaines et array
229
Préférences d’application
Stockage des entiers, chaines et array
230
Préférences d’application
Récupérer des entiers, chaines et array
231
Il est temps de faire une
pause
C’est fini pour cette séance, rendez-vous la séance prochaine pour un
cours sur la programmation declarative avec Jetpack Compose
232
PROGRAMMATION
DECLARATIVE
233
SÉANCE 7-12
JETPACK
COMPOSE
234
Le cours de cette semaine porte sur Jetpack compose.
• Introduction à Jetpack Compose
• Installation, configuration et concepts de base de Jetpack Compose
• Layouts , contraintes et widgets
• Thèmes et styles
• Navigation et interactions
235
Introduction à Jetpack Compose
Présentation
236
Introduction à Jetpack Compose
Présentation
237
Introduction à Jetpack Compose
Présentation
238
Introduction à Jetpack Compose
Présentation
239
Introduction à Jetpack Compose
Présentation
240
Introduction à Jetpack Compose
Applications créées avec Compose
241
Introduction à Jetpack Compose
Installation et configuration
dependencies {
// Jetpack Compose
implementation '[Link]:ui:1.1.0'
implementation '[Link]:material:1.1.0'
implementation '[Link]:runtime-livedata:1.1.0'
}
242
Introduction à Jetpack Compose
Installation et configuration
plugins {
id '[Link]' version '1.5.31'
id 'kotlin-parcelize'
id '[Link]'
id '[Link]-services'
id 'kotlin-android'
id 'kotlin-android-extensions'
}
243
Introduction à Jetpack Compose
Installation et configuration
244
Introduction à Jetpack Compose
Création d’une application Android avec compose
245
Introduction à Jetpack Compose
Création d’une application Android avec compose
246
Introduction à Jetpack Compose
Création d’une application Android avec compose
247
Introduction à Jetpack Compose
Création d’une application Android avec compose
• La vue Projet (1) affiche les fichiers et les dossiers de votre projet.
• La vue Code (2) est la zone dans laquelle vous pouvez modifier le code.
• La vue Conception (3) vous permet d'afficher un aperçu de votre
application.
248
Introduction à Jetpack Compose
Présentation de la structure du code
249
Introduction à Jetpack Compose
Présentation de la structure du code
❑ La fonction onCreate() est le point d'entrée de cette
application et elle appelle d'autres fonctions pour créer
l'interface utilisateur. Dans les programmes Kotlin, la
fonction main() est le point précis où démarre le compilateur
Kotlin dans votre code. Dans les applications Android, c'est
la fonction onCreate() qui remplit ce rôle.
251
Introduction à Jetpack Compose
Présentation de la structure du code
IMPORTANT :
252
Introduction à Jetpack Compose
Présentation de la structure du code
255
Etats de base de Jetpack Compose
Présentation des états de base
256
Etats de base de Jetpack Compose
Présentation des états de base
258
Les Widgets de Jetpack Compose
Notion de mise en page
259
Les Widgets de Jetpack Compose
Notion de mise en page
Column(
//modificateur
modifier=Modifier.
){
// les Widgets
}
Row(
//modificateur
){
// les Widgets
}
Box(
//modificateur
){
// les Widgets
260
}
Les Widgets de Jetpack Compose
Notion de mise en page
Les modificateurs sont utilisés pour ajouter des fonctionnalités ou
des comportements supplémentaires aux widgets et aux éléments
de mise en page. Les modificateurs sont chaînés à l'aide de
l'opérateur . , ce qui permet de les combiner pour créer des mises
en page plus complexes. Voici quelques exemples de modificateurs
couramment utilisés en Jetpack Compose :
• background: pour définir la couleur de fond d'un widget.
• border: pour ajouter une bordure à un widget.
• padding: pour ajouter un espace autour d'un widget.
• clickable: pour rendre un widget cliquable.
• fillMaxSize: pour remplir toute la taille disponible dans le
conteneur parent.
• align: pour aligner un widget à l'intérieur de son conteneur
parent.
• weight: pour définir la répartition de l'espace disponible entre
plusieurs widgets dans un conteneur. 261
Les Widgets de Jetpack Compose
Notion de mise en page
Row(
modifier = [Link](),
horizontalArrangement = [Link]
){
Column(
modifier = Modifier
.fillMaxSize()
.padding([Link])
.verticalScroll(rememberScrollState())
){
}
262
Les Widgets de Jetpack Compose
Présentation de Widgets
263
Les Widgets de Jetpack Compose
Présentation de Widgets
Text (
text = "Je suis un texte",
style = TextStyle(
fontSize = [Link],
fontWeight = [Link],
color = [Link]
)
)
264
Les Widgets de Jetpack Compose
Présentation de Widgets
Image(
painter = painterResource([Link].ic_launcher),
contentDescription = "My Image",
modifier = [Link]([Link])
)
265
Les Widgets de Jetpack Compose
Présentation de Widgets
TextField(
value = "",
onValueChange = { /* Action à effectuer lors de la saisie de texte
*/ },
label = {
Text("Entrez votre texte ici")
},
modifier = [Link]()
)
267
Les Widgets de Jetpack Compose
Présentation de Widgets
Icon(
[Link],
contentDescription = "Favorite Icon",
tint = [Link],
modifier = [Link]([Link])
)
268
Les Widgets de Jetpack Compose
Présentation de Widgets
269
Les Widgets de Jetpack Compose
Présentation de Widgets
Checkbox(
checked = isChecked,
onCheckedChange = { isChecked = it },
colors = [Link](
checkedColor = [Link],
uncheckedColor = [Link]
),
modifier = [Link]([Link])
) 270
Les Widgets de Jetpack Compose
Présentation de Widgets
RadioButton: utilisé pour collecter une valeur unique à partir d'une liste
d'options. Il prend en charge diverses propriétés de bouton radio telles
que la couleur, la forme, la taille, etc.
val options = listOf("Option 1", "Option 2", "Option 3")
var selectedOption by remember { mutableStateOf(options[0]) }
Column {
[Link] { option ->
Row(
modifier = Modifier
.fillMaxWidth()
.padding(vertical = [Link]),
verticalAlignment = [Link]
){
RadioButton(
selected = selectedOption == option,
onClick = { selectedOption = option },
modifier = [Link](horizontal = [Link])
)
Text(
text = option,
style = [Link].body1,
modifier = [Link](start = [Link])
)
}
} 271
}
Les Widgets de Jetpack Compose
Présentation de Widgets
Switch : utilisé pour collecter une valeur booléenne (vrai/faux) en
basculant entre deux états (activé et désactivé). Il prend en
charge diverses propriétés de commutateur telles que la couleur,
la forme, la taille, etc.
var switchState by remember { mutableStateOf(false) }
Column(
modifier = [Link]([Link])
){
Text(
text = "Activer la fonctionnalité",
style = [Link].subtitle1
)
Switch(
checked = switchState,
onCheckedChange = { switchState = it },
modifier = [Link](top = [Link]),
colors = [Link](
checkedThumbColor = [Link],
checkedTrackColor = [Link](alpha = 0.5f)
)
)
} 272
Les Widgets de Jetpack Compose
Présentation de Widgets
ProgressBar : utilisé pour afficher la progression d'une tâche. Il
prend en charge diverses propriétés de barre de progression telles
que la couleur, la forme, la taille, etc.
var progress by remember { mutableStateOf(0.5f) }
Column {
LinearProgressIndicator(
progress = progress,
modifier = [Link](),
color = [Link]
)
Spacer(modifier = [Link]([Link]))
Button(onClick = {
progress += 0.1f
if (progress >= 1f) progress = 0f
}) {
Text(text = "Increase progress")
}
} 273
Les Widgets de Jetpack Compose
Présentation de Widgets
Spacer(modifier = [Link]([Link]))
274
Les Widgets de Jetpack Compose
Présentation de Widgets
LazyColumn(
modifier = Modifier
.fillMaxSize()
.padding([Link]),
verticalArrangement = [Link]([Link]),
horizontalAlignment = [Link],
contentPadding = PaddingValues(vertical = [Link]),
reverseLayout = true,
state = scrollState,
){
items(names) { name ->
Text(
text = name,
modifier = [Link](),
textAlign = [Link],
style = [Link].h6
)
}
276
}
Les Widgets de Jetpack Compose
Présentation de Widgets
LazyRow : est un widget de Jetpack Compose qui permet d'afficher
une horizontale de manière efficace. Contrairement à Row, LazyRow ne
crée que les éléments qui sont actuellement visibles à l'écran, ce qui
permet de réduire l'utilisation de la mémoire et d'optimiser les
performances de l'application.
LazyRow(
modifier = [Link](),
horizontalArrangement = [Link]([Link])
){
items(10) { index ->
Box(
modifier = Modifier
.width([Link])
.height([Link])
.background([Link]),
contentAlignment = [Link]
){
Text(text = "Item $index", color = [Link])
}
}
277
}
Les Widgets de Jetpack Compose
Scaffold
278
Les Widgets de Jetpack Compose
Scaffold
Scaffold(
topBar = {
//bar d’outils
},
bottomBar = {
//bar de navigation
},
floatingActionButton = {
//bouton flotante
},
content = {
//contenu de la page
}
) 279
Les Widgets de Jetpack Compose
topBar
Les éléments possibles de topBar sont:
❑ title : Le titre de la barre d'applications.
❑ subtitle : Le sous-titre de la barre d'applications.
❑ navigationIcon : L'icône de navigation à gauche de la barre
d'applications. On peut utiliser un IconButton avec une icône de
menu.
❑ actions : Les actions à droite de la barre d'applications. On peut
utiliser les IconButton avec des icônes de recherche, de favoris et de
partage. Etc..
❑ elevation : L'élévation de la barre d'applications, qui ajoute une
ombre pour donner une impression de profondeur.
❑ backgroundColor : La couleur de fond de la barre d'applications.
❑ contentColor : La couleur de texte des éléments de la barre
d'applications.
❑ navigationContentColor : La couleur de texte de l'icône de
navigation
280
Les Widgets de Jetpack Compose
topBar
topBar={TopAppBar(
title = { Text("My App") },
subtitle = { Text("Subtitle") },
navigationIcon = {
IconButton(onClick = { /* TODO */ }) {
Icon([Link])
}
},
actions = {
IconButton(onClick = { /* TODO */ }) {
Icon([Link])
}
IconButton(onClick = { /* TODO */ }) {
Icon([Link])
}
IconButton(onClick = { /* TODO */ }) {
Icon([Link])
}
},
elevation = [Link],
backgroundColor = [Link],
contentColor = [Link],
navigationContentColor = [Link],
modifier = [Link]([Link])
)
} 281
Les Widgets de Jetpack Compose
bottomBar
282
Les Widgets de Jetpack Compose
bottomBar
BottomNavigation(
backgroundColor = [Link], // set the background color to blue
elevation = [Link] // set the elevation to 8dp
){
BottomNavigationItem(
selected = true,
onClick = { /* TODO */ },
icon = { Icon([Link], contentDescription = "Home") },
label = { Text("Home") },
selectedContentColor = [Link],
unselectedContentColor = [Link]
)
BottomNavigationItem(
selected = false,
onClick = { /* TODO */ },
icon = { Icon([Link], contentDescription = "Search") },
label = { Text("Search") },
selectedContentColor = [Link],
unselectedContentColor = [Link]
)
BottomNavigationItem(
selected = false,
onClick = { /* TODO */ },
icon = { Icon([Link], contentDescription = "Settings") },
label = { Text("Settings") },
selectedContentColor = [Link],
unselectedContentColor = [Link]
)
}
283
Les Widgets de Jetpack Compose
FloatingButton
284
Les Widgets de Jetpack Compose
floatingActionButton
FloatingActionButton(
onClick = { /* action à exécuter lors du clic */ },
backgroundColor = [Link],
contentColor = [Link],
content = {
Icon([Link], contentDescription = "Ajouter")
},
elevation = [Link]([Link]),
modifier = [Link]([Link])
)
285
Exercice
Reproduire avec Jetpack compose les interfaces ci-dessous
286
Thèmes & styles
@Composable
fun MyApp() {
MaterialTheme(colors = myTheme) {
// l'interface utilisateur de l'application
}
}
289
Thèmes & styles
290
Thèmes & styles
Button(
onClick = { /* handle button click */ },
modifier = Modifier
.padding([Link])
.height([Link])
.width([Link]),
colors = TextStyle
){
Text("Cliquez ici")
}
} 291
Composition & recomposition
293
Composition & recomposition
294
La gestion des états
remember
Button(onClick = { counter++ }) {
Text("Cliquez moi $counter fois")
}
295
La gestion des états
remember
[Link]("Nouvel élément")
Dans cet exemple, nous avons créé une liste list qui est
mémorisée à l'aide de la fonction remember. Nous avons
ensuite ajouté un nouvel élément à la liste. Chaque fois que
la composition est recomposée, list est rappelée avec les
mêmes éléments qu'auparavant, ce qui garantit la stabilité
de l'interface utilisateur. 296
La gestion des états
viewModel
@Composable
fun MyScreen(viewModel: MyViewModel = viewModel()) {
Button(onClick = { [Link]++ }) {
Text("Cliquez moi ${[Link]} fois")
}
}
297
Navigation avec Jetpack compose
Composant de navigation
298
Navigation avec Jetpack compose
Composant de navigation
300
Navigation avec Jetpack compose
Navigation entre écrans de compose
301
Navigation avec Jetpack compose
Navigation entre écrans de compose
303
Navigation avec Jetpack compose
Navigation entre écrans de compose
304
Navigation avec Jetpack compose
Navigation entre écrans de compose
@Composable
fun NavGraph (navController: NavHostController){
NavHost(
navController = navController,
startDestination = [Link])
{
composable(route = [Link]){
LoginScreen(navController)
}
composable(route = [Link]){
HomeScreen(navController)
}
composable(route = [Link]){
DetailScreen()
}
}
} 305
Navigation avec Jetpack compose
Navigation entre écrans de compose
@Composable
fun LoginScreen(navController: NavController)
@Composable
fun HomeScreen(navController: NavController)
306
Navigation avec Jetpack compose
Navigation entre écrans de compose
onClick = {
//TODO: Navigate to Home Screen
[Link]([Link])
}
307
Navigation avec Jetpack compose
Passage d’arguments lors de la navigation
composable(
"destination/{name}",
arguments = listOf(navArgument("name") { type =
[Link] })
) { backStackEntry ->
DestinationScreen(
name = [Link]?.getString("name")
)
}
308
Navigation avec Jetpack compose
Passage d’arguments lors de la navigation
Button(
onClick = {
[Link]("destination/Jean")
}
){
Text("Aller à la destination avec le nom Jean")
}
309
Navigation avec Jetpack compose
Passage d’arguments lors de la navigation
@Composable
fun DestinationScreen(name: String?) {
// Utilisez la valeur de "name" ici
}
310
XML & Jetpack compose
Interopérabilité entre XML et Jetpack compose
311
XML & Jetpack compose
Interopérabilité entre XML et Jetpack compose
312
XML & Jetpack compose
ComposeView
313
XML & Jetpack compose
ComposeView
314
XML & Jetpack compose
ComposeView
dependencies {
implementation '[Link]:ui:1.1.0'
implementation '[Link]:material:1.1.0'
implementation '[Link]:runtime-livedata:1.1.0'
}
315
XML & Jetpack compose
ComposeView
316
XML & Jetpack compose
ComposeView
<[Link]
android:id="@+id/myComposeView"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"/>
</LinearLayout>
317
XML & Jetpack compose
ComposeView
SQLITE
319
Le cours de cette semaine porte sur les bases de données SQLite .
• Création d'une base de données SQLite
• Requêtes SQL en Kotlin
320
Introduction à SQLite
Présentation de SQLite
321
Introduction à SQLite
Présentation de SQLite
322
Introduction à SQLite
Kotlin et SQLite
324
Introduction à SQLite
Kotlin et SQLite
325
Base de données SQLite
Création de BD et de ses tables
Pour créer une base de données SQLite avec Kotlin dans une
application Android, vous devez suivre les étapes suivantes :
328
Base de données SQLite
Clé primaire et clé étrangère
329
Base de données SQLite
Clé primaire et clé étrangère
330
Base de données SQLite
Manipulation des données
331
Base de données SQLite
Ajouter les enregistrements
Pour insérer des données dans une table vous pouvez utiliser la
méthode insert de la classe SQLiteDatabase.
Voici un exemple de code pour insérer un nouvel utilisateur avec
un nom et une adresse e-mail :
val dbHelper = DatabaseHelper(this)
val db = [Link]
if (newRowId == -1L) {
// L'insertion a échoué
[Link](this,"Erreur lors de l'insertion!",Toast.LENGTH_SHORT).show()
} else {
// L'insertion a réussi
[Link](this,"Insertion réussie avec l'ID $newRowId",Toast.LENGTH_SHORT).show()
}
332
Base de données SQLite
Affichage des données
333
Base de données SQLite
Affichage des données
Pour mettre à jour des données existantes dans une table, vous
pouvez utiliser la méthode update de la classe SQLiteDatabase.
Voici un exemple de code pour mettre à jour l'adresse e-mail de
l'utilisateur ayant un ID spécifique :
336
Base de données SQLite
Suppression des données
337
Base de données SQLite
Exercice
Exercice :
Créer une application Android qui permettant de gérer les
utilisateurs d’un site internet.
L’application doit permettre d’enregistré, de modifier de
supprimer et de mettre à jour les informations sur les
utilisateurs.
Un utilisateur dispose d’un identifiant, d’un nom , d’un mot
de passe, d’un adresse e-mail, d’un numéro de telephone et
d’une adresse.
338
Base de données SQLite
Exercice
339
Base de données SQLite
Exercice
340
Base de données SQLite
La jointure
341
Base de données SQLite
La jointure
Exemple:
Supposons que nous avons deux tables : users et orders.
La table users contient des informations sur les utilisateurs,
notamment leur nom et leur adresse électronique, et la table
orders contient des informations sur les commandes passées
par ces utilisateurs, notamment la date de commande et le
montant total de la commande. Les deux tables sont liées
par l'identifiant de l'utilisateur, qui est une clé étrangère
dans la table orders.
342
Base de données SQLite
La jointure
val dbHelper = DatabaseHelper(this)
val db = [Link]
val projection = arrayOf("[Link]", "[Link]")
val selection = "[Link] = orders.user_id"
val sortOrder = "[Link] DESC"
val cursor = [Link](
"users INNER JOIN orders ON [Link] = orders.user_id", // Tables et jointure
projection, // Colonnes à retourner
selection, // Clause WHERE
null, // Arguments de la clause WHERE
null, // GROUP BY
null, // HAVING
sortOrder // Clause ORDER BY
)
val userList = ArrayList<String>()
if ([Link]()) {
do {
val name = [Link]([Link]("name"))
val product = [Link]([Link]("product"))
val userInfo = "Nom : $name | Produit : $product"
[Link](userInfo)
} while ([Link]())
} 343
Base de données SQLite
La jointure
344
Base de données SQLite
Exercice
347
Et C’est tout !
[Link]
[Link]
348
Jetpack Compose offers a declarative approach to building Android UIs, allowing developers to create complex interfaces using composable functions with Kotlin code. This reduces boilerplate code, enhances UI management, and allows real-time UI updates. Interoperability with XML allows existing XML layouts to integrate smoothly, enabling gradual adoption of Compose in legacy projects. It simplifies managing state and event handling through its built-in modifiers and live updates .
Android ListView uses adapters, like ArrayAdapter, to bridge the data set and the ListView, efficiently managing data presentation. ListView leverages View recycling and reuses item views, minimizing memory use by only maintaining visible views and a limited number of off-screen views. This optimization reduces the need for constantly inflating and destroying views, ensuring smoother scrolling and improved overall performance .
RecyclerView enhances ListView by offering more flexible layouts through LayoutManager, supporting horizontal and grid layouts natively, unlike the linear layout of ListView. It uses a ViewHolder pattern to improve performance by caching view references, significantly reducing view inflation overhead. RecyclerView's modular adapter pattern and efficient onChangeListeners allow seamless large data set management without impacting performance, making it an efficient choice for complex UIs .
To create a string array resource in an Android application, you define it in the res/values/arrays.xml file using the <string-array> tag. You can then access this resource in your Kotlin code using the resources.getStringArray(R.array.resource_name) method, which returns an Array<String> .
Resource identifiers in Android are defined using the @+id/ notation within layout XML files to create new IDs. Once defined, these IDs can be used to reference the corresponding views through R.id.id_name in Kotlin code. This system enables developers to programmatically access and manipulate UI elements efficiently, ensuring consistent and organized code management .
Vector drawables provide resolution-independent images, ensuring crisp visuals at any screen size or density, directly benefiting app performance by reducing the number and size of drawable files needed for different resolutions. Unlike PNGs, they scale without quality loss, significantly cutting down on drawable resource variants and decreasing APK size. However, complex vector graphics might incur more processing than static PNGs, affecting performance when used excessively .
LiveData in Jetpack Compose facilitates efficient state management by providing observable data holders that notify composables of data changes, ensuring UIs reflect the latest data without manual updates. You declare LiveData within ViewModel and observe it within composable functions using observeAsState(), enabling automatic UI recomposition on data change, enhancing response to dynamic data .
Integrating Jetpack Compose with XML-based projects allows for leveraging Compose's declarative UI benefits, such as reduced boilerplate and state handling, while maintaining the familiarity and stability of existing XML layouts. This hybrid approach facilitates gradual migration, reducing the overhead of complete redesigns. Limitations might include increased complexity in managing two paradigms and potential discrepancies in behavior across UI systems. ComposeView bridges this gap, allowing Composable functions within XML layouts .
The Android layout management system uses various ViewGroup subclasses to organize UI components efficiently. LinearLayout can align components in a row or column, while RelativeLayout and ConstraintLayout position components in relation to each other. TableLayout organizes components into rows and columns like a table. These layouts form a view tree structure, enabling a clear hierarchical representation of UI components .
The @Composable annotation in Jetpack Compose marks a Kotlin function as capable of generating UI components declaratively. It instructs the Compose compiler to manage and track the state of the UI elements it creates. The function can be called from setContent() or other @Composable functions, allowing a modular and reusable component-based architecture for UI design .