Académique Documents
Professionnel Documents
Culture Documents
Module 205 :
Android Studio
et
Java
Hamid Mask
Formateur en TDI
1 / 167
Créez des applications pour Android
2 – Système d’exploitation :
Pour Windows : Windows Vista ou plus récent.
Pour Mac OS : Mac OS 10.8.5 ou plus récent.
Pour développer en Java, nous devons installer le JDK (pour «Java Development Kit»).
Le JRE (Java Runtime Environment), qui contient la JVM (Java Virtual Machine. En
gros, c'est l'ensemble des outils qui vous permettra d’exécuter des applications Java.
Le JDK (Java Development Kit), qui contient le JRE (afin d’exécuter les applications
Java), mais aussi un ensemble d'outils pour compiler et déboguer votre code.
2 / 167
Cliquez sur (Accept License Agreement) avant de continuer.
3 / 167
C'est quoi un SDK ?
Les applications Android sont développées en Java, mais un appareil sous Android ne
comprend pas le Java tel quel, il comprend une variante du Java adaptée pour Android.
Une fois le téléchargement terminé, lancez l'installation. Pendant l'installation, vous devrez
répondre à certaines questions :
4 / 167
Sélectionnez les options en fonction de votre matériel puis cliquez sur "Next".
(Conservez les options Android SDK et Android Virtual Device).
5 / 167
Indiquez où vous souhaitez que Android Studio et le SDK soient installés, puis cliquez sur
Next:
6 / 167
Une fois l'installation terminée, lancez Android Studio.
Dans la fenêtre Android Studio cliquez sur Start a new Android Studio Project pour
ouvrir l'assistant de création de projet.
7 / 167
1. Application Name : c’est le nom qui apparaîtra sur l'appareil et sur Google Play.
Project Location : indiquez ici l'emplacement où les fichiers de votre projet seront
créés.
8 / 167
Création de la première activité.
Vous pouvez constater qu’un projet avec une activité de type Empty Activity contient
un label au milieu qui affiche le message "Hello World !".
Pour exécuter ce programme il faudra relier votre mobile Android via un câble USB à
votre PC, ou bien installer un émulateur (un téléphone sur l’écran de votre PC).
C’est le sujet des deux paragraphes suivants.
Choisissez l'option :
Options de développement
9 / 167
III – Création d’une machine virtuelle. (Emulateur)
Une machine virtuelle est un logiciel qui va simuler une machine physique avec ses
caractéristiques propres. Par exemple, nous avons l’habitude d’utiliser parfois des machines
virtuelles Linux sur un ordinateur Windows pour faire du développement sous ces
environnements.
Nous allons donc apprendre comment créer une machine virtuelle qui simulera une
machine qui exécute Android afin que nous puissions exécuter nos applications directement
sur notre ordinateur.
Nous allons faire cela dans les paragraphes suivants.
IV – Notions de base.
On va tout d'abord voir ce qu'on appelle des activités et comment les manipuler.
Sachant que la majorité de vos applications contiendront plusieurs activités.
Nous verrons aussi ce que sont les vues et nous créerons enfin notre premier projet.
Ces différentes fenêtres sont appelées des activités. Une activité est une interface
graphique qui remplit tout l'écran. Par conséquent, une application ne peut afficher qu'une
seule activité à la fois. La figure suivante illustre ce phénomène.
10 / 167
De plus, une activité contient des informations sur l'état actuel de l'application : ces
informations s'appellent le context. Ce context constitue un lien avec le système Android
ainsi que les autres activités de l'application, comme le montre la figure suivante.
Si un utilisateur reçoit un appel, il devient plus important qu'il puisse y répondre que de
faire autre chose. La règle est la suivante :
À tout moment votre application peut laisser place à une autre application, qui a
une priorité plus élevée.
Une activité existera dans plusieurs états au cours de sa vie, par exemple un état actif
pendant lequel l'utilisateur l'exploite, et un état de pause quand l'utilisateur reçoit un appel.
Plus clairement, quand une application se lance, elle se met tout en haut de ce qu'on
appelle la pile d'activités.
Une pile est une structure de données de type « LIFO » (Last In First Out = Dernier
Entré Premier Sortie), c'est-à-dire qu'il n'est possible de n'avoir accès qu'à un seul élément de
la pile, le tout premier élément, aussi appelé sommet. Quand on ajoute un élément à cette
pile, le nouvel élément prendra la première place et deviendra le nouveau sommet. Quand on
veut récupérer un élément, ce sera le sommet qui sera récupéré, sorti de la liste et l'objet en
deuxième place deviendra le nouveau sommet, comme illustré à la figure suivante :
11 / 167
Illustration :
12 / 167
Arrêté (Stopped) : L'activité est tout simplement invisible pour l'utilisateur, car une
autre activité prend toute la place sur l'écran. Le système peut redémarrer l’application
ou la détruire pour libérer de la mémoire.
Voici un schéma qui présente ce que l'on appelle le cycle de vie d'une activité, c'est-
à-dire qu'il indique les étapes que va traverser notre activité pendant sa vie, de sa naissance à
sa mort. Vous verrez que chaque étape du cycle est représentée par une méthode. Nous
verrons comment utiliser ces méthodes en temps voulu.
13 / 167
Created : l’activité a été créée et prête à être affiché.
Started : l’activité est visible, mais l’utilisateur ne peut l’utiliser. Cet état est immédiatement suivi par
l’état Resumed.
Resumed : l’activité est en exécution en avant plan et peut être utilisé par l’utilisateur. (démarrer ou
redémarrer).
Paused : l’activité est interrompue par un appel téléphonique ou un message. Elle se trouve dans un
état stoppé. L’activité est toujours visible, mais derrière une boite de dialogue et l’utilisateur ne peut
l’utiliser.
Stopped : l’activité est déplacée en arrière-plan et devient donc invisible, mais l’instance existe
toujours en mémoire. Une activité peut être relancée à partir de cet état sans la recréer.
Aller au menu :
Tools Android AVD Manager
14 / 167
Cliquez sur le bouton Create Virtual Device en bas de l'écran :
15 / 167
Nous pouvons sélectionner ici une version d'Android à installer sur notre AVD
Enfin, nous allons pouvoir sélectionner les derniers paramètres pour notre AVD. Nous gardons
toutes les valeurs proposées.
16 / 167
Notre machine virtuelle a été créée avec succès.
17 / 167
V – Exemples d’applications simples.
1 – Hello World !
Le Layout :
18 / 167
Après exécution sur notre émulateur :
19 / 167
L’application est bien installée dans l’émulateur :
Notre application devient une application parmi les nombreuses applications sur notre
téléphone.
20 / 167
2 – Copier un Texte : TextView – Button - EditView
Choisisser New Project :
Application name : Application-01
Campany domain : tdi2.ma
Le Layout :
Un TextBox : editText1
Un Bouton : buttonCopier
Un label : textView1
Le code Java sera écrit presque toujours dans la procedure événémentielle onCreate :
21 / 167
22 / 167
V – TPs d’initiation.
Le Layout : nous avons utilisé un RelativeLayout pour placer les Views les unes après les
autres.
Un label : textView
Deux Boutons : buttonClick et buttonReset
MainActivity.java
package introduction.application_02;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
import android.widget.Button;
Button btnClick;
Button btnReset;
TextView txt;
23 / 167
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btnClick.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
btnReset.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
txt.setText(String.valueOf(0));
}
});
}
}
Exécution de l’application :
24 / 167
Raccourcis clavier :
Ctrl + D copie le bloc selectionné ou la ligne courante lorsque rien n’est selectionné.
Ctrl + / commente le bloc selectionné ligne par ligne (//ligne1 ; //ligne2 ; . . .).
Ctrl + Maj + / commente le bloc selectionné tout entier (/* ligne1 ; ligne2 . . . */).
Use Ctrl+J to complete any valid Live Template abbreviation if you don't remember it. For example, type it
and press Ctrl+J to see what happens.
Définitions
px ou point est un pixel sur l'écran physique.
Les dpi sont des pixels par pouce sur l'écran physique et représentent la densité de l'affichage.
(1 pouce = 1 inch = 2,54 cm)
dp = pixels indépendants de la densité.
sp est un pixel indépendant de l’échelle.
Ces unités sont relatives à un écran de 160 ppp, donc un dp est un pixel sur un écran de 160
ppp.
Avec l’unité dp les objets graphiques (tels des boutons) apparaissent avec la même taille sur
différentes écrans.
25 / 167
Quoi utiliser sp ou dp ?
Utilisez sp pour la taille du texte.
Utilisez dp pour tout le reste.
26 / 167
27 / 167
TP3 – Nombres aléatoires : Générer des nombres aléatoires à l’aide de
la fonction Random().
New Project :
Application name : ApplicationAleatoire
Campany domain : tdi2.ma
Le Layout : nous avons utilisé un RelativeLayout pour placer les Views les unes
après les autres.
Un label : textView1
Un Bouton : buttonOK
MainActivity.java
package ma.tdi2.applicationaleatoire;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
TextView txtResultat;
Button btnOK;
28 / 167
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btnOK.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int valeur = (int) (Math.random()*100);
txtResultat.setText(Integer.toString(valeur));
}
});
}
}
29 / 167
Un peu de cours Java
30 / 167
Faire des Tests
31 / 167
Etape 2 : deviner un nombre aléatoire fixe et le comparer à la valeurSaisie.
Voici le code :
package ma.tdi2.applicationaleatoire;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
32 / 167
TextView txtResultat;
Button btnOK;
EditText edTSaisie;
int valeur; // Variable de classe (Globale)
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btnOK.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if ( valeur == valeurSaisie) {
// Cas : L'utilisateur gagne
txtResultat.setText("Bravo, vous avez gagné !");
}
else {
// Cas : L'utilisateur a perdu
if ( valeurSaisie > valeur){
txtResultat.setText("Perdu Valeur trop grande !");
}
else {
txtResultat.setText("Perdu Valeur trop petite !");
}
}
});
}
}
Voici le résultat :
33 / 167
TP4 – Deux activités : une activité qui appelle une autre en cliquant sur une image.
Etape 1 : Ajouter un ImageView pour afficher une image.
New Project :
Application name : AppDeuxActivites
Campany domain : tdi2.ma
Le Layout : nous allons utiliser un RelativeLayout pour placer les Views les
unes après les autres.
Avant d’ajouter l’ImageView, il faudra mettre l’image terre.jpg dans le dossier drawable.
L’imageView sera utilisé pour passer de cette activité à la deuxième activité, par simple clic
dessus.
34 / 167
Une fois l’ImageView glissé au milieu de l’activité, une fenêtre s’ouvrira pour la sélection de
l’image terre.jpg.
Ouvrer le fichier string.xml (app res values) et ajouter les 2 strings suivants :
Vous pouvez générer un string en se plaçant dans la chaine de caractère et appuyant sur
Ctrl + Entrée.
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/Hello"
......
<TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/Jeu"
android:layout_centerHorizontal="true"
android:layout_marginTop="24dp"
android:text="@string/Welcome"
......
35 / 167
Exécution de l’application :
Avant d’ajouter l’ImageView, il faudra mettre les images cookie.png et fondecran14.jpg dans le
dossier drawable.
L’imageView, cette fois-ci, sera utilisé pour compter les clics sur l’image cookie.png.
Ouvrer le fichier string.xml (app res values) et ajouter les 2 strings suivants :
<color name="White">#fff</color>
<TextView
android:id="@+id/points"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/Point_Nb"
android:textColor="@color/White"
36 / 167
......
CookieActivity :
Pour faire communiquer les deux activés (l’activité principale et celle que nous
venons de créer) il faut passer par un Intent.
Un Intent représente l’intention de faire quelque chose, et permet à l’activité principale de
lancer la deuxième activité.
Pour appeler l’activité CookieActivity en cliquant sur l’image de l’activité MainActivity, on doit
ajouter à cette dernière le code suivant :
MainActivity.java
package ma.tdi2.deuxactivites;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
jeu.setOnClickListener(new View.OnClickListener() {
37 / 167
@Override
public void onClick(View v) {
Intent autreActivity = new
Intent(getApplicationContext(),CookieActivity.class);
startActivity(autreActivity);
finish();
}
});
}
}
Une fois la deuxième activité (CookieActivity) affichée, un clic sur l’image incrémente la valeur
du nombre affiché dans le textView.
CookieActivity.java
package ma.tdi2.deuxactivites;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_cookie);
cookie.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
clicks++;
points.setText("Points : " + clicks);
}
});
}
}
38 / 167
Exécution de l’application :
39 / 167
TP5 – Menu : Basic Activity.
40 / 167
content_main (Design du Basic Actvity)
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"
android:textColor="@android:color/black"
android:textSize="30sp"
android:textStyle="bold"
android:layout_centerInParent="true"/>
</RelativeLayout>
main_menu.xml
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
tools:context="ma.tdi2.menu.MainActivity">
<item
android:id="@+id/action1"
android:orderInCategory="1"
android:title="Client"
app:showAsAction="never" />
<item
android:id="@+id/action2"
android:orderInCategory="2"
android:title="Article"
app:showAsAction="never" />
<item
android:id="@+id/action3"
android:orderInCategory="3"
android:title="Quitter"
app:showAsAction="never" />
</menu>
41 / 167
MainActivity.java
package ma.tdi2.menu;
import . . .
@Override
protected void onCreate(Bundle savedInstanceState) {
. . .
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
. . .
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
. . .
//noinspection SimplifiableIfStatement
if (id == R.id.action1) {
Intent intent = new Intent(getApplicationContext(),Client.class);
startActivity(intent);
}
if (id == R.id.action2) {
Intent intent = new Intent(getApplicationContext(),Article.class);
startActivity(intent);
}
if (id == R.id.action3) {
finish();
}
return super.onOptionsItemSelected(item);
}
}
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
tools:context="ma.tdi2.app_menu.MainActivity">
<item
android:id="@+id/action1"
android:orderInCategory="3"
android:title="Client"
app:showAsAction="never" />
<item
android:id="@+id/action2"
android:orderInCategory="2"
42 / 167
android:title="Article"
app:showAsAction="never" />
<item
android:id="@+id/action3"
android:orderInCategory="1"
android:title="Quitter"
app:showAsAction="never" />
</menu>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
tools:context="ma.tdi2.app_menu.MainActivity">
<item
android:id="@+id/action1"
android:orderInCategory="1"
android:title="Client"
app:showAsAction="always" />
<item
android:id="@+id/action2"
android:orderInCategory="2"
android:title="Article"
app:showAsAction="always" />
<item
android:id="@+id/action3"
android:orderInCategory="3"
android:title="Quitter"
app:showAsAction="always" />
</menu>
43 / 167
Cas 4 : Affichage mixte des options du menu.
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
tools:context="ma.tdi2.app_menu.MainActivity">
<item
android:id="@+id/action1"
android:orderInCategory="1"
android:title="Client"
app:showAsAction="always" />
<item
android:id="@+id/action2"
android:orderInCategory="2"
android:title="Article"
app:showAsAction="never" />
<item
android:id="@+id/action3"
android:orderInCategory="3"
android:title="Quitter"
app:showAsAction="never" />
</menu>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
tools:context="ma.tdi2.app_menu.MainActivity">
<item
android:id="@+id/action1"
android:orderInCategory="1"
android:title="Client"
android:icon="@drawable/icon1"
app:showAsAction="always" />
<item
android:id="@+id/action2"
android:orderInCategory="2"
android:title="Article"
android:icon="@drawable/icon2"
app:showAsAction="always" />
<item
android:id="@+id/action3"
android:orderInCategory="3"
android:title="Quitter"
android:icon="@drawable/icon3"
app:showAsAction="always" />
</menu>
44 / 167
Cas 6 : Menu et sous menu.
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
tools:context="ma.tdi2.app_menu.MainActivity">
<item
android:id="@+id/action1"
android:orderInCategory="1"
android:title="Client"
app:showAsAction="never" />
<item
android:id="@+id/action2"
android:orderInCategory="2"
android:title="Article"
app:showAsAction="never" />
<item
android:orderInCategory="3"
android:title="Commande"
app:showAsAction="never">
<menu>
<item
android:id="@+id/action3_1"
android:orderInCategory="1"
android:title="Gestion Commande"
app:showAsAction="never" />
<item
android:id="@+id/action3_2"
android:orderInCategory="2"
android:title="Consultation commande"
app:showAsAction="never" />
</menu>
</item>
<item
android:id="@+id/action4"
android:orderInCategory="4"
android:title="Quitter"
app:showAsAction="never" />
</menu>
45 / 167
Accès aux activités : Client, Article, Gest_Commande et Cons_Commande.
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action1) {
Intent intent = new Intent(getApplicationContext(),Client.class);
startActivity(intent);
}
if (id == R.id.action2) {
Intent intent = new Intent(getApplicationContext(),Article.class);
startActivity(intent);
}
if (id == R.id.action3_1) {
Intent intent = new Intent(getApplicationContext(),Gest_Commande.class);
startActivity(intent);
}
if (id == R.id.action3_2) {
Intent intent = new Intent(getApplicationContext(),Cons_Commande.class);
startActivity(intent);
}
if (id == R.id.action4) {
finish();
}
return super.onOptionsItemSelected(item);
}
46 / 167
47 / 167
TP6 – POO (Gestion Clients).
Activity_main.xml (MainActivity)
<TableLayout
android:layout_width="368dp"
android:layout_height="495dp"
android:background="@drawable/background7"
android:stretchColumns="1"
tools:layout_editor_absoluteX="8dp"
tools:layout_editor_absoluteY="8dp">
<TableRow>
<TextView
android:text="Nom :"
android:textSize="24sp"
android:textStyle="bold" />
<EditText
android:id="@+id/nom"
48 / 167
android:textSize="24sp" />
</TableRow>
<TableRow>
<TextView
android:text="Prenom :"
android:textSize="24sp"
android:textStyle="bold" />
<EditText
android:id="@+id/prenom"
android:textSize="24sp" />
</TableRow>
<Button
android:id="@+id/save"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Save"
android:textSize="24sp" />
</TableLayout>
</RelativeLayout>
Client.java
package ma.tdi2.gestionclients;
/**
* Created by MASK on 27/02/2018.
*/
MainActivity.java
package ma.tdi2.gestionclients;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.RadioButton;
import android.widget.RadioGroup;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
save.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
cl.setNom(nom.getText().toString());
cl.setPrenom(prenom.getText().toString());
}
});
}
}
50 / 167
Ajouter un TableRow dans lequel on mettra un TextView et un RadioGroup :
<TableRow>
<TextView
android:text="Sexe :"
android:textSize="24sp"
android:textStyle="bold" />
<RadioGroup android:id="@+id/sexes">
<RadioButton
android:id="@+id/male"
android:text="Male"
android:textSize="24sp"
android:textStyle="bold" />
<RadioButton
android:id="@+id/femelle"
android:text="Femelle"
android:textSize="24sp"
android:textStyle="bold" />
</RadioGroup>
</TableRow>
51 / 167
Modifier la classe Client pour ajouter le champ Sexe :
Client.java
package ma.tdi2.gestionclients;
/**
* Created by MASK on 27/02/2018.
*/
52 / 167
Prenom = prenom;
}
MainActivity.java
package ma.tdi2.gestionclients;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.RadioButton;
import android.widget.RadioGroup;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
save.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
cl.setNom(nom.getText().toString());
cl.setPrenom(prenom.getText().toString());
switch (sexes.getCheckedRadioButtonId()) {
case R.id.male:
cl.setSexe("Male");
break;
case R.id.femelle:
cl.setSexe("Femelle");
break;
}
}
});
}
}
53 / 167
Rien ne se pas lors de l’exécution, car l’instance n’est pas utilisée !
<TableLayout
android:layout_width="368dp"
android:layout_height="495dp"
android:background="@drawable/background7"
android:stretchColumns="1"
tools:layout_editor_absoluteX="8dp"
tools:layout_editor_absoluteY="8dp">
<TableRow>
<TextView
android:text="Nom :"
android:textSize="24sp"
android:textStyle="bold" />
<EditText
android:id="@+id/nom"
android:textSize="24sp" />
</TableRow>
<TableRow>
<TextView
android:text="Prenom :"
android:textSize="24sp"
android:textStyle="bold" />
<EditText
android:id="@+id/prenom"
android:textSize="24sp" />
</TableRow>
<TableRow>
<TextView
android:text="Sexe :"
android:textSize="24sp"
android:textStyle="bold" />
<RadioGroup android:id="@+id/sexes">
<RadioButton
android:id="@+id/male"
android:text="Male"
android:textSize="24sp"
android:textStyle="bold" />
<RadioButton
android:id="@+id/femelle"
android:text="Femelle"
android:textSize="24sp"
android:textStyle="bold" />
</RadioGroup>
</TableRow>
<Button
android:id="@+id/save"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Save"
android:textSize="24sp" />
54 / 167
</TableLayout>
</android.support.constraint.ConstraintLayout>
package ma.tdi2.gestionclients;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import java.util.ArrayList;
import java.util.List;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
save.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
55 / 167
Etape 4 : Ajouter une Liste (ListView).
Le Design :
Activity_main.xml
<TableLayout
android:id="@+id/infos"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:stretchColumns="1"
android:layout_alignParentBottom="true">
<TableRow>
<TextView
android:text="Nom :"
android:textSize="24sp"
android:textStyle="bold" />
<EditText
android:id="@+id/nom"
android:textSize="24sp" />
</TableRow>
<TableRow>
<TextView
android:text="Prenom :"
android:textSize="24sp"
android:textStyle="bold" />
56 / 167
<EditText
android:id="@+id/prenom"
android:textSize="24sp" />
</TableRow>
<TableRow>
<TextView
android:text="Sexe :"
android:textSize="24sp"
android:textStyle="bold" />
<RadioGroup
android:id="@+id/sexes"
android:layout_height="wrap_content">
<RadioButton
android:id="@+id/homme"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Homme"
android:checked="true"
android:textSize="24sp"
android:textStyle="bold" />
<RadioButton
android:id="@+id/femme"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Femme"
android:textSize="24sp"
android:textStyle="bold" />
</RadioGroup>
</TableRow>
<Button
android:id="@+id/save"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Save"
android:textSize="24sp" />
</TableLayout>
<ListView
android:id="@+id/clients"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_above="@id/infos"/>
</RelativeLayout>
MainActivity.java
package ma.tdi2.gestionclients;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.ArrayAdapter;
57 / 167
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import java.util.ArrayList;
import java.util.List;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
save.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
58 / 167
Un peu de cours :
L'adaptateur ArrayAdapter
Il s'agit d'une interface (adaptateur) permettant le passage des données à une interface
d’affichage telles une ListView, un Spinner (Combo) ou un GridView .
Paramètres:
Exemple d'utilisation :
Par defaut, ArrayAdapter affiche les données dans le widget en appelant la méthode
toString() pour chaque objet dans la collection et place le résultat dans un TextView.
59 / 167
TP7 – ArrayAdapter simple.
ListViewClient (Activity)
60 / 167
activity_list_view_client.xml
<TextView
android:id="@+id/textView1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="ListView :"
android:textAlignment="center"
android:textColor="@android:color/holo_green_light"
android:textSize="40sp"
android:textStyle="bold" />
<ListView
android:id="@+id/list"
android:layout_width="250dp"
android:layout_height="wrap_content"
android:background="@drawable/image8"
android:layout_below="@id/textView1"
android:layout_centerHorizontal="true"/>
</RelativeLayout>
Client.java
61 / 167
public class Client {
private String Nom;
private String Prenom;
private Character Sexe;
public Client() {
Nom = "";
Prenom = "";
Sexe = ' ';
}
@Override
public String toString() {
return (getNom()+ " " + getPrenom()+" "+((getSexe()=='H')? "Homme":"Femme"));
}
}
ListViewClient.java
package ma.tdi2.menu_simple_arrayadapter;
import android.graphics.Color;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
62 / 167
import android.widget.ListView;
import android.widget.TextView;
import java.util.ArrayList;
listClient.add(new Client("Alami","Khalid",'H'));
listClient.add(new Client("Wahbi","Rachid",'H'));
listClient.add(new Client("Naji","Sanae",'F'));
listClient.add(new Client("Talbi","Aicha",'F'));
lv = (ListView) findViewById(R.id.lv);
adapter = new ArrayAdapter<Client>(this,android.R.layout.simple_list_item_1,
listClient);
lv.setAdapter(adapter);
lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
Toast.makeText(getApplicationContext(),
((Client)listClient.get(position)).toString(),Toast.LENGTH_LONG).show();
}
});
}
}
Nous devons tester le code une fois pour ArrayList, et une deuxième fois pour le tableau de
clients.
63 / 167
Fonctionnement de l’ArrayAdapter simple :
ArrayAdapter
DataSource La Vue
listClient toString() ListView
Client1 TextView
Objets Client Client2 TextView Cellules
Client3 TextView
Client4 TextView
ArrayAdapter utilise la methode toString() pour afficher le contenu d’un objet client dans une
cellule de ListView. Il parcourt toute la collection listClient et fait la même chose pour chaque
objet de la collection.
ListView est considéré comme une suite de cellules. Chaque cellule contient un TextView.
ArrayAdapter affecte le résultat de toString() au TextView.
La methode toString() doit être redefinie dans la classe Client pour concaténer les infos de
l’objet sous forme de string.
Dans le cas d’un Tableau de string, l’ArrayAdapter utilise la méthode toString() originale (non
celle redefinie qui ne peut exister que dans un objet Client)
DridViewClient (Activity)
activity_grid_view_client.xml
65 / 167
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".GridViewClient">
<TextView
android:id="@+id/textView1"
android:layout_width="250dp"
android:layout_height="wrap_content"
android:text="GridView"
android:textAlignment="center"
android:layout_centerHorizontal="true"
android:textColor="@android:color/holo_green_light"
android:textSize="36sp"
android:textStyle="bold" />
<GridView
android:id="@+id/gridview1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/textView1"
android:layout_centerHorizontal="true"
android:background="@android:color/holo_orange_dark"
android:numColumns="3"
android:listSelector="@color/Yellow"
/>
</RelativeLayout>
Colors.xml
GridViewClient.java
package ma.tdi2.menu_simple_adapter;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.GridView;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.List;
//String[] T; = {"A","B","C","D","E","F","G","H","I"};
ArrayAdapter<String> adapter;
List<Client> listClient = new ArrayList<Client>();
// ArrayAdapter<Client> adapter=null;
66 / 167
GridView gv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_grid_view_client);
listClient.add(new Client("Alami","Khalid",'H'));
listClient.add(new Client("Wahbi","Rachid",'H'));
listClient.add(new Client("Naji","Sanae",'F'));
listClient.add(new Client("Talbi","Aicha",'F'));
for(int i =0;i<listClient.size();i++){
T[3*i] = listClient.get(i).getNom();
T[3*i+1] = listClient.get(i).getPrenom();
T[3*i+2] = (listClient.get(i).getSexe()=='H')? "Homme":"Femme";;
}
Toast.makeText(getApplicationContext(),String.valueOf(T.length),Toast.LENGTH_LONG).
show();
GridView gv = (GridView)findViewById(R.id.gridview1);
adapter = new
ArrayAdapter<String>(getApplicationContext(),android.R.layout.simple_list_item_1,T)
;
gv.setAdapter(adapter);
}
}
67 / 167
GridView : affichage des infos du client dans un Toast à chaque clic dans une ligne.
GridViewClient.java
package ma.tdi2.tp7_arrayadaptersimple_ga;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.GridView;
import android.widget.ListView;
import android.widget.Toast;
import java.util.ArrayList;
// String[] T = {"A","B","C","D","E","F","G","H","I"};
ArrayAdapter<String> adapter;
ArrayList<Client> listClient = new ArrayList<Client>();
int k;
// ArrayAdapter<Client> adapter;
GridView gv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_grid_view_);
68 / 167
listClient.add(new Client("Alami","Khalid",'H'));
listClient.add(new Client("Wahbi","Rachid",'H'));
listClient.add(new Client("Naji","Sanae",'F'));
listClient.add(new Client("Talbi","Aicha",'F'));
for(int i =0;i<listClient.size();i++){
T[3*i] = listClient.get(i).getNom();
T[3*i+1] = listClient.get(i).getPrenom();
T[3*i+2] = (listClient.get(i).getSexe()=='H')? "Homme":"Femme";;
}
gv = (GridView) findViewById(R.id.gv);
adapter = new
ArrayAdapter<String>(getApplicationContext(),android.R.layout.simple_list_item_1,T)
;
gv.setAdapter(adapter);
gv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
k = (int) (position/3);
Toast.makeText(getApplicationContext(),T[3*k] + " " + T[3*k+1] + "
" + T[3*k+2],Toast.LENGTH_LONG).show();
}
});
} // fin onCreate
}
GridView et ArrayList
69 / 167
SpinnerClient (Activity)
activity_spinner_client.xml
<TextView
android:id="@+id/textView1"
android:layout_width="250dp"
android:layout_height="wrap_content"
android:text="Spinner"
android:textAlignment="center"
android:layout_centerHorizontal="true"
android:textColor="@android:color/holo_green_light"
android:textSize="36sp"
android:textStyle="bold" />
<Spinner
android:id="@+id/spin"
android:layout_width="250dp"
android:layout_height="wrap_content"
android:layout_below="@id/textView1"
android:layout_centerHorizontal="true"
android:background="@android:color/holo_blue_dark"
android:popupBackground="@color/green"
android:dropDownSelector="@color/yellow"
android:spinnerMode="dropdown" />
</RelativeLayout>
SpinnerClient.java
70 / 167
package ma.tdi2.menu_arrayadapter_simple;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.Spinner;
import java.util.ArrayList;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_spinner_);
listClient.add(new Client("Alami","Khalid",'H'));
listClient.add(new Client("Wahbi","Rachid",'H'));
listClient.add(new Client("Naji","Sanae",'F'));
listClient.add(new Client("Talbi","Aicha",'F'));
sp = (Spinner) findViewById(R.id.spin);
adapter = new ArrayAdapter<Client>(getApplicationContext(),
android.R.layout.simple_spinner_item,listClient);
adapter.setDropDownViewResource(R.layout.spinner_item);
sp.setAdapter(adapter);
}
}
71 / 167
Exercices à faire :
Content_main.xml :
73 / 167
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/background6"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
tools:context=".MainActivity"
tools:showIn="@layout/activity_main">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="ArrayAdapter Simple"
android:layout_centerInParent="true"
android:textSize="32sp"
android:textColor="@android:color/holo_blue_dark"
android:textStyle="bold"
/>
</RelativeLayout>
MainActivity.java :
Intent intent;
@Override
protected void onCreate(Bundle savedInstanceState) {
. . .
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
. . .
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action1) {
Intent intent = new Intent(getApplicationContext(),ListView_.class);
startActivity(intent);
}
if (id == R.id.action2) {
Intent intent = new Intent(getApplicationContext(),GridView_.class);
startActivity(intent);
}
if (id == R.id.action3) {
74 / 167
Intent intent = new Intent(getApplicationContext(),Spinner_.class);
startActivity(intent);
}
if (id == R.id.action4) {
Intent intent = new
Intent(getApplicationContext(),SpinnerEtListView.class);
startActivity(intent);
}
if (id == R.id.action5) {
Intent intent = new
Intent(getApplicationContext(),RadioGroupEtLisTview.class);
startActivity(intent);
}
//RadioGroupEtLisTview
if (id == R.id.action6) {
finish();
}
return super.onOptionsItemSelected(item);
}
}
Méthode :
Créer ListViewClient (Activity) Ajouter TextView + ListView.
Créer monlayout.xml
ListViewClient (Activity)
activity_list_view_client.xml
<ListView
android:id="@+id/lv"
android:layout_width="300dp"
android:layout_height="wrap_content"
android:background="@drawable/image22"
android:layout_below="@id/textView1"
android:layout_centerHorizontal="true" />
</RelativeLayout>
<TextView
android:id="@+id/textView1"
android:layout_width="0dp"
android:layout_height="60dp"
android:layout_weight="1"
android:gravity="center"
android:text="textView1"
android:textAlignment="center"
android:textColor="@android:color/holo_green_dark"
android:textSize="24sp"
android:textStyle="bold" />
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="2"
android:orientation="vertical">
<TextView
android:id="@+id/textView2"
android:layout_width="match_parent"
android:layout_height="34dp"
android:gravity="center"
android:text="textView2"
android:textColor="@android:color/holo_green_dark"
android:textSize="18sp"
android:textStyle="bold" />
<TextView
android:id="@+id/textView3"
android:layout_width="match_parent"
android:layout_height="26dp"
android:gravity="center"
android:text="textView3"
android:textColor="@android:color/holo_green_dark"
android:textSize="18sp"
77 / 167
android:textStyle="bold" />
</LinearLayout>
</LinearLayout>
package ma.tdi2.menu_arrayadapter_personalis;
import android.content.Context;
import android.support.annotation.LayoutRes;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.TextView;
@NonNull
@Override
78 / 167
public View getView(int position, @Nullable View convertView, @NonNull
ViewGroup parent) {
View v;
LayoutInflater li =
(LayoutInflater)getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
v = li.inflate(R.layout.monlayout,null); // null = No parent
nom.setText(cl.getNom());
prenom.setText(cl.getPrenom());
sexe.setText(cl.getSexe().toString());
return v;
}
}
La classe LayoutInflater est utilisée pour créer un nouvel objet View (ou Layout) à partir du
fichier monlayout.xml. Cet objet (v) est utilisable dans le code.
ListViewClient.java
package ma.tdi2.menu_arrayadapter_personalis;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import java.util.ArrayList;
ListView lv;
ArrayList<Client> listClient = new ArrayList<Client>();;
ArrayAdapter monadapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_list_view_client);
listClient.add(new Client("Alami","Khalid",'H'));
listClient.add(new Client("Wahbi","Rachid",'H'));
listClient.add(new Client("Naji","Sanae",'F'));
listClient.add(new Client("Talbi","Aicha",'F'));
lv = (ListView) findViewById(R.id.lv);
79 / 167
Fonctionnement de l’ArrayAdapter personnalisé
monadapter crée une instance de monlayout, puis y met les données d’un objet client et
affiche le résultat dans une cellule de ListView. Il fait la même chose pour tous les objets
clients de la collection listClient. Nous obtenons le résultat suivant :
ListView et ArrayList
monlayout_image.xml
<ImageView
android:id="@+id/icon"
android:layout_width="0dp"
android:layout_height="80dp"
android:layout_weight="1"
android:background="@drawable/h" />
80 / 167
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="2"
android:orientation="vertical">
<TextView
android:id="@+id/textView1"
android:layout_width="match_parent"
android:layout_height="50dp"
android:gravity="center"
android:text="textView2"
android:textColor="@android:color/holo_green_dark"
android:textSize="40sp"
android:textStyle="bold" />
<TextView
android:id="@+id/textView2"
android:layout_width="match_parent"
android:layout_height="30dp"
android:gravity="center"
android:text="textView3"
android:textColor="@android:color/holo_green_dark"
android:textSize="25sp"
android:textStyle="bold" />
</LinearLayout>
</LinearLayout>
monlayout_image (design)
package ma.tdi2.menu_arrayadapter_personalis;
import android.content.Context;
import android.support.annotation.LayoutRes;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.TextView;
TextView nom;
TextView prenom;
ImageView icon;
81 / 167
super(context, resource);
}
@NonNull
@Override
public View getView(int position, @Nullable View convertView, @NonNull
ViewGroup parent) {
View v;
LayoutInflater li =
(LayoutInflater)getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
v = li.inflate(R.layout.monlayout_image,null);
nom.setText(cl.getNom());
prenom.setText(cl.getPrenom());
if (cl.getSexe() == 'H')
{
icon.setImageResource(0);
icon.setImageResource(R.drawable.h);
}
else
{
icon.setImageResource(0);
icon.setImageResource(R.drawable.f);
}
return v;
}
}
ListViewClient_image.java
package ma.tdi2.menu_arrayadapter_personalis;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import java.util.ArrayList;
ListView lv;
ArrayList<Client> listClient = new ArrayList<Client>();;
ArrayAdapter monadapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_list_view_client_image);
listClient.add(new Client("Alami","Khalid",'H'));
listClient.add(new Client("Wahbi","Rachid",'H'));
listClient.add(new Client("Naji","Sanae",'F'));
listClient.add(new Client("Talbi","Aicha",'F'));
lv = (ListView) findViewById(R.id.lv);
82 / 167
monadapter = new MonAdapter_image(getApplicationContext(),0);
lv.setAdapter(monadapter);
monadapter.addAll(listClient);
}
}
Exercices à faire :
Reprendre les exercices 4) et 5) du TP7 avec personnalisation des ListView (s).
83 / 167
Exercice 2 : Cas GridView.
GridViewClient (Activity)
activity_grid_view_client.xml (layout)
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".GridViewClient">
<TextView
android:id="@+id/textView1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="GridView personnalisé"
android:textAlignment="center"
android:textColor="@android:color/holo_green_light"
android:textSize="30sp"
android:textStyle="bold" />
<GridView
android:id="@+id/gv"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/textView1"
android:listSelector="@android:color/holo_orange_dark"
android:background="@android:color/holo_blue_dark"
android:numColumns="3"/>
</RelativeLayout>
84 / 167
Marque.java (class)
package ma.tdi2.arrayadapterpersonnalis;
GridViewClient.java
package ma.tdi2.arrayadapterpersonnalis;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.GridView;
import java.util.ArrayList;
GridView gv;
ArrayList<Marque> listMarque;
ArrayAdapter monAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_grid_view_client);
85 / 167
listMarque.add(new Marque("Nissan",R.drawable.logo5));
listMarque.add(new Marque("Ford",R.drawable.logo6));
listMarque.add(new Marque("BMW",R.drawable.logo7));
listMarque.add(new Marque("Suzuki",R.drawable.logo8));
listMarque.add(new Marque("Honda",R.drawable.logo9));
gv = (GridView)findViewById(R.id.gv);
monAdapter = new MonAdapter_gridview(getApplicationContext(),0);
gv.setAdapter(monAdapter);
monAdapter.addAll(listMarque);
gv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
Intent intent = new Intent(getApplicationContext(),AfficherMarque.class);
intent.putExtra("marque",listMarque.get(position).getMarque());
intent.putExtra("position",position);
startActivity(intent);
}
});
}
}
monlayout_gridview.xml (layout)
<ImageView
android:id="@+id/imageView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
app:srcCompat="@drawable/logo1"
android:layout_marginTop="30dp" />
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/imageView1"
android:layout_centerHorizontal="true"
android:text="TextView"
android:textColor="@android:color/black"
android:textSize="30sp" />
</RelativeLayout>
MonAdapter_GridView.java (class)
86 / 167
package ma.tdi2.menu_arrayadapter_personalis;
import android.content.Context;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.TextView;
@NonNull
@Override
public View getView(int position, @Nullable View convertView, @NonNull
ViewGroup parent) {
View v;
LayoutInflater li =
(LayoutInflater)getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
v = li.inflate(R.layout.monlayout_gridview,null);
marque.setText(mq.getMarque());
icon.setImageResource(mq.getIdMarque());
return v;
}
}
GridViewClient AfficherMarque
87 / 167
AfficherMarque (Activity)
Activity_Afficher_Marque (layout)
<ImageView
android:id="@+id/img"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="50dp"
app:srcCompat="@drawable/logo_1"
android:layout_centerHorizontal="true" />
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/img"
android:layout_centerHorizontal="true"
android:text="HYUNDAI"
android:textColor="@android:color/holo_blue_bright"
android:textSize="60sp" />
</RelativeLayout>
88 / 167
AfficherMarque.java
package ma.tdi2.menu_arrayadapter_personalis;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
ImageView img;
int T[]={R.drawable.logo_1,R.drawable.logo_2,R.drawable.logo_3,R.drawable.logo_4,
R.drawable.logo_5,R.drawable.logo_6,R.drawable.logo_7,R.drawable.logo_8,
R.drawable.logo_9} ;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_afficher_marque);
img.setImageResource(T[idImage]);
TextView textView1 =(TextView) findViewById(R.id.textView1);
textView1.setText(marque);
//
Toast.makeText(getApplicationContext(),String.valueOf(idImage),Toast.LENGTH_LONG)
.show();
// Toast.makeText(getApplicationContext(),marque,Toast.LENGTH_LONG).show();
}
}
89 / 167
Un peu de cours : Passage de valeurs par Intent.
Soient deux activités Activity1 et Avtivity2. Nous voulons passer des valeurs de
différents types au moyen d’un Intent (intent)
Activity1 Avtivity2
startActivity(intent);
Exercice à faire :
Exercice 1 :
Passer les données d’un objet client selectionneé dans un ListView vers une deuxième
activité, puis les afficher.
Banane Pomme
10 5
Fraise Kiwi
15 20
Grenade Orange
8 6
Pastèque Cerise
4 12
90 / 167
Personnaliser un GridView à 2 colonnes pour obtenir le résultat désiré.
Créer une classe Fruit avec les attributs : nomFruit, prix et idFruit
Implémenter un ArrayAdapter personnalisé.
MainActivity (Activity)
1. Client.java
package ma.tdi2.app_arrayadapterperso;
public Client() {
this.nom = "";
this.prenom = "";
this.sexe = ' ';
}
91 / 167
}
@Override
public String toString() {
return nom + " " + prenom + " " + ((sexe=='H')? "Homme":"Femme");
}
}
2. activity_main.xml
<TextView
android:id="@+id/TextView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="40dp"
android:layout_centerHorizontal="true"
android:text="Spinner Personnalisé"
android:textSize="32sp"
android:textStyle="bold"
android:textColor="@color/fuchsia"
android:background="@android:color/holo_blue_bright" />
<Spinner
android:id="@+id/sp"
android:layout_width="250dp"
android:layout_height="80dp"
android:layout_centerHorizontal="true"
android:layout_marginTop="100dp"
android:spinnerMode="dropdown"
android:background="@android:color/holo_blue_light"
android:popupBackground="@color/green"
android:dropDownSelector="@color/yellow" />
</RelativeLayout>
3. monlayout_image.xml
92 / 167
android:layout_height="wrap_content">
<ImageView
android:id="@+id/icon"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="2"
app:srcCompat="@drawable/h" />
<LinearLayout
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="2"
android:orientation="vertical">
<TextView
android:id="@+id/textView2"
android:layout_width="match_parent"
android:layout_height="50dp"
android:gravity="center"
android:textSize="24sp"
android:textStyle="bold"
android:textColor="@color/green"
android:background="@android:color/holo_blue_light"
android:text="TextView2" />
<TextView
android:id="@+id/textView3"
android:layout_width="match_parent"
android:layout_height="30dp"
android:gravity="center"
android:textSize="18sp"
android:textStyle="bold"
android:textColor="@color/green"
android:background="@android:color/holo_blue_light"
android:text="TextView3" />
</LinearLayout>
</LinearLayout>
4. MonAdapter_image.java
package ma.tdi2.app_arrayadapterperso;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
@Override
// Affiche les données dans le menu deroulant du Spinner
93 / 167
public View getDropDownView(int position, @Nullable View convertView,
@NonNull ViewGroup parent) {
return createItemView(position, convertView, parent);
}
@NonNull
@Override
public View getView(int position, @Nullable View convertView, @NonNull
ViewGroup parent) {
return createItemView(position, convertView, parent);
}
View v;
LayoutInflater li =
(LayoutInflater)getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
v = li.inflate(R.layout.monlayout_image,null); // null : pas de parent
Client cl = getItem(position);
nom.setText(cl.getNom());
prenom.setText(cl.getPrenom());
if (cl.getSexe() == 'H')
{
icon.setImageResource(0);
icon.setImageResource(R.drawable.h);
} else
{
icon.setImageResource(0);
icon.setImageResource(R.drawable.f);
}
return v;
5. MainActivity.java
package ma.tdi2.app_arrayadapterperso;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.GridView;
import android.widget.ListView;
import android.widget.Spinner;
import java.util.ArrayList;
94 / 167
Spinner sp;
ArrayList<Client> listClient = new ArrayList<Client>();
MonAdapter_image adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listClient.add(new Client("Alami","Khalid",'H'));
listClient.add(new Client("Wahbi","Rachid",'H'));
listClient.add(new Client("Naji","Sanae",'F'));
listClient.add(new Client("Talbi","Aicha",'F'));
sp = (Spinner) findViewById(R.id.sp);
sp.setAdapter(adapter);
adapter.addAll(listClient);
sp.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position,
long id) {
Toast.makeText(getApplicationContext(),listClient.get(position).getNom()+"
"+listClient.get(position).getPrenom(), Toast.LENGTH_LONG).show();
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
});
} // Fin onCreate
95 / 167
Spinner et ArrayList
Exercice à faire :
Exercice 1 :
Refaire ce TP en utilisant la classe Marque du cas GridView et transformer monlayout.xml en
Linear Layout horizontal.
96 / 167
TP9 – Accès aux bases de données SQLite.
MajClient_ListView
activity_maj_client__list_view.xml
<TableRow
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/textView1"
android:layout_width="0dp"
android:layout_height="wrap_content"
97 / 167
android:layout_weight="1"
android:text="Id_Cl :"
android:textColor="@android:color/black"
android:textSize="24sp"
android:textStyle="bold" />
<EditText
android:id="@+id/id_Cl"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="2"
android:ems="10"
android:inputType="textPersonName"
android:textColor="@android:color/holo_blue_light"
android:textSize="24sp"
android:textStyle="bold" />
</TableRow>
<TableRow
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/textView2"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="Nom :"
android:textColor="@android:color/black"
android:textSize="24sp"
android:textStyle="bold" />
<EditText
android:id="@+id/nom"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="2"
android:ems="10"
android:inputType="textPersonName"
android:textColor="@android:color/holo_blue_light"
android:textSize="24sp"
android:textStyle="bold" />
</TableRow>
<TableRow
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/textView3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="Sexe :"
android:textColor="@android:color/black"
android:textSize="24sp"
android:textStyle="bold" />
<RadioGroup
android:id="@+id/sexes"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="2">
98 / 167
<RadioButton
android:id="@+id/homme"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="Homme"
android:textColor="@android:color/black"
android:textSize="24sp"
android:textStyle="bold" />
<RadioButton
android:id="@+id/femme"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="Femme"
android:textColor="@android:color/black"
android:textSize="24sp"
android:textStyle="bold" />
</RadioGroup>
</TableRow>
<Button
android:id="@+id/save"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Save"
android:textSize="24sp" />
</TableLayout>
<ListView
android:id="@+id/lv"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/infos" />
</RelativeLayout>
Client.java
package ma.tdi2.acces_auxbds_sqlite;
public Client() {
this.id_Cl = 0;
Nom = "";
Sexe = ' ';
}
@Override
public String toString() {
99 / 167
return (id_Cl +" "+ Nom+" "+((Sexe =='H') ? "Homme" : "Femme"));
}
VenteDatabaseManager.java
package ma.tdi2.acces_auxbds_sqlite;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import java.util.ArrayList;
import java.util.List;
@Override
public void onCreate(SQLiteDatabase db) {
String CREATE_TABLE_Client = "CREATE TABLE " + TABLE_Client +
"(" +
COL_1 + " INTEGER PRIMARY KEY," +
COL_2 + " TEXT," +
COL_3 + " CHAR(1)" +
")";
db.execSQL(CREATE_TABLE_Client);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("DROP TABLE IF EXISTS " + TABLE_Client);
onCreate(db);
}
100 / 167
db.insert(TABLE_Client,null, values);
db.close();
}
SQLiteDatabase db = getReadableDatabase();
Cursor cursor = db.rawQuery(CLIENTS_SELECT_QUERY, null);
if (cursor.moveToFirst()) {
do {
} while(cursor.moveToNext());
}
return listeClient;
}
}
MajClient_ListView.java
package ma.tdi2.acces_auxbds_sqlite;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.RadioGroup;
import android.widget.TextView;
import android.widget.Toast;
import java.util.ArrayList;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_maj_client__list_view);
101 / 167
// Afficher dans la ListView
adapter = new
ArrayAdapter<Client>(getApplicationContext(),android.R.layout.simple_list_item_1,ma
BD.getAllClients());
lv.setAdapter(adapter);
save.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
cl = new Client();
cl.id_Cl = Integer.parseInt(id_Cl.getText().toString());
cl.Nom = nom.getText().toString();
switch (sexes.getCheckedRadioButtonId()) {
case R.id.homme:
cl.Sexe = 'H';
break;
case R.id.femme:
cl.Sexe = 'F';
break;
}
// Effacer le formulaire
id_Cl.setText("");
nom.setText("");
sexes.clearCheck();
id_Cl.requestFocus();
}
});
}
}
102 / 167
Etape 2 : Ajouter, modification et supppressions de clients.
103 / 167
...
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<Button
android:id="@+id/save"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Save"
android:textSize="24sp"
android:layout_weight="1" />
<Button
android:id="@+id/update"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Update"
android:textSize="24sp"
android:layout_weight="1"/>
<Button
android:id="@+id/delete"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Delete"
android:textSize="24sp"
android:layout_weight="1" />
</LinearLayout>
</TableLayout>
package ma.tdi2.acces_auxbds_sqlite;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.TextView;
import android.widget.Toast;
import java.util.ArrayList;
// Ajouter un client
save.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
cl = new Client();
cl.id_Cl = Integer.parseInt(id_Cl.getText().toString());
cl.Nom = nom.getText().toString();
switch (sexes.getCheckedRadioButtonId()) {
case R.id.homme:
cl.Sexe = 'H';
break;
case R.id.femme:
cl.Sexe = 'F';
break;
}
}
});
// Selectionner un client
lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
cl = maBD.getAllClients().get(position);
id_Cl.setText(String.valueOf(cl.id_Cl));
nom.setText(cl.Nom);
if (cl.Sexe == 'H'){
homme = (RadioButton) findViewById(R.id.homme);
homme.setChecked(true);
}
else {
femme = (RadioButton) findViewById(R.id.femme);
femme.setChecked(true);
}
k=position;
}
105 / 167
});
// Modifier le client
update = (Button) findViewById(R.id.update);
update.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
cl = maBD.getAllClients().get(k);
cl.Nom = nom.getText().toString();
switch (sexes.getCheckedRadioButtonId()) {
case R.id.homme:
cl.Sexe = 'H';
break;
case R.id.femme:
cl.Sexe = 'F';
break;
}
// Supprimer le client
delete = (Button) findViewById(R.id.delete);
delete.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
cl = maBD.getAllClients().get(k);
// Supprimer dans la base
maBD.deleteClient(cl);
106 / 167
VenteDatabaseManager.java
// Update a Client
public void UpdateClient(Client client) {
// Create and/or open the database for writing
SQLiteDatabase db = getWritableDatabase();
// Updating
db.update(TABLE_Client, values, COL_1 + " = ?",
new String[] { String.valueOf(client.id_Cl) });
db.close();
}
// Delete a Client
public void deleteClient(Client client) {
// Create and/or open the database for writing
SQLiteDatabase db = getWritableDatabase();
db.delete(TABLE_Client,"id_Cl=?",new
String[]{String.valueOf(client.id_Cl)});
// db.execSQL("Delete From " + TABLE_Client + " Where id_Cl = " +
String.valueOf(client.id_Cl));
db.close();
}
107 / 167
TP10 – Gestion des clients et commandes.
1 - Menu.
MajClient_ListView
activity_saisie_client.xml
108 / 167
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/image22"
tools:context=".SaisieClient">
<TableLayout
android:id="@+id/infos"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:layout_alignParentTop="true">
<TableRow
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="4dp" >
<TextView
android:id="@+id/textView1"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="Id_Cl :"
android:textColor="@android:color/black"
android:textSize="24sp"
android:textStyle="bold" />
<EditText
android:id="@+id/id_Cl"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="2"
android:inputType="textPersonName"
android:textColor="@android:color/black"
android:textSize="24sp"
android:textStyle="bold"
android:background="@android:color/holo_blue_light" />
</TableRow>
<TableRow
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="4dp" >
<TextView
android:id="@+id/textView2"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="Nom :"
android:textColor="@android:color/black"
android:textSize="24sp"
android:textStyle="bold" />
<EditText
android:id="@+id/nom"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="2"
android:ems="10"
android:inputType="textPersonName"
109 / 167
android:textColor="@android:color/black"
android:textSize="24sp"
android:textStyle="bold"
android:background="@android:color/holo_blue_light" />
</TableRow>
<TableRow
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="4dp" >
<TextView
android:id="@+id/textView3"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="Ville :"
android:textColor="@android:color/black"
android:textSize="24sp"
android:textStyle="bold" />
<EditText
android:id="@+id/ville"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="2"
android:inputType="textPersonName"
android:textColor="@android:color/black"
android:textSize="24sp"
android:textStyle="bold"
android:background="@android:color/holo_blue_light" />
</TableRow>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:padding="4dp" >
<Button
android:id="@+id/save"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Save"
android:textSize="24sp"
android:layout_weight="1" />
</LinearLayout>
</TableLayout>
<ListView
android:id="@+id/lv"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="4dp"
android:layout_below="@id/infos" />
</RelativeLayout>
Client.java
110 / 167
package ma.tdi2.gestionclientsetcommndes;
public Client() {
this.Id_Cl = 0;
Nom = "";
Ville = "";
}
@Override
public String toString() {
return Id_Cl + " " + Nom + " " + Ville;
}
}
VenteDatabaseManager.java
package ma.tdi2.gestionclientsetcommndes;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import java.util.ArrayList;
import java.util.List;
111 / 167
}
@Override
public void onCreate(SQLiteDatabase db) {
String CREATE_TABLE_Client = "CREATE TABLE " + TABLE_Client +
"(" +
COL_1 + " INTEGER PRIMARY KEY," +
COL_2 + " TEXT," +
COL_3 + " TEXT" +
")";
db.execSQL(CREATE_TABLE_Commande);
db.execSQL(CREATE_TABLE_Client);
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("DROP TABLE IF EXISTS " + TABLE_Client);
db.execSQL("DROP TABLE IF EXISTS " + TABLE_Commande);
onCreate(db);
}
db.insert(TABLE_Client,null, values);
// String CLIENTS_INSERT_QUERY = "INSERT INTO "+ TABLE_Client + "Values(" +
client.Id_Cl
// + ",'" + client.Nom + "','" + client.Ville + "')";
// db.execSQL(CLIENTS_INSERT_QUERY);
db.close();
}
db.insert(TABLE_Commande,null, values);
// String COMMANDES_INSERT_QUERY = "INSERT INTO "+ TABLE_Commande +
"Values(" + commande.Id_Com
// + ",'" + commande.Date_Com + "','" + commande.Id_Cl + "')";
// db.execSQL(COMMANDES_INSERT_QUERY);
112 / 167
db.close();
}
SQLiteDatabase db = getReadableDatabase();
Cursor cursor = db.rawQuery(CLIENTS_SELECT_QUERY, null);
if (cursor.moveToFirst()) {
do {
} while(cursor.moveToNext());
}
return listeClient;
}
SQLiteDatabase db = getReadableDatabase();
Cursor cursor2 = db.rawQuery(COMMANDES_SELECT_QUERY, null);
if (cursor2.moveToFirst()) {
do {
} while(cursor2.moveToNext());
}
return listeCommande;
}
// Update a Client
public void UpdateClient(Client client) {
// Create and/or open the database for writing
SQLiteDatabase db = getWritableDatabase();
// Updating
db.update(TABLE_Client, values, COL_1 + " = ?",
new String[] { String.valueOf(client.Id_Cl) });
db.close();
113 / 167
}
// Delete a Client
public void deleteClient(Client client) {
// Create and/or open the database for writing
SQLiteDatabase db = getWritableDatabase();
db.delete(TABLE_Client,"Id_Cl=?",new
String[]{String.valueOf(client.Id_Cl)});
// db.execSQL("Delete From " + TABLE_Client + " Where Id_Cl = " +
String.valueOf(client.Id_Cl));
db.close();
}
SaisieClient.java
package ma.tdi2.gestionclientsetcommndes;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.TextView;
114 / 167
// Ajouter un client
save.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
cl = new Client();
cl.Id_Cl = Integer.parseInt(id_Cl.getText().toString());
cl.Nom = nom.getText().toString();
cl.Ville = ville.getText().toString();
}
});
} // Fin onCreate
115 / 167
SaisieCommande (Activity) :
activity_saisie_commande.xml
<TableLayout
android:id="@+id/infos"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:layout_alignParentTop="true">
<TableRow
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="4dp">
<TextView
android:id="@+id/textView1"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="Id Client :"
android:textColor="@android:color/black"
android:textSize="24sp"
android:textStyle="bold" />
<Spinner
116 / 167
android:id="@+id/sp"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="2"
android:background="@android:color/holo_blue_light"
android:popupBackground="@color/green"
android:dropDownSelector="@color/yellow"
android:spinnerMode="dropdown" />
</TableRow>
<TableRow
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="4dp" >
<TextView
android:id="@+id/textView2"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="Id Com :"
android:textColor="@android:color/black"
android:textSize="24sp"
android:textStyle="bold" />
<EditText
android:id="@+id/id_com"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="2"
android:inputType="textPersonName"
android:textColor="@android:color/black"
android:textSize="24sp"
android:textStyle="bold"
android:background="@android:color/holo_blue_light" />
</TableRow>
<TableRow
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="4dp">
<TextView
android:id="@+id/textView3"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="Date :"
android:textColor="@android:color/black"
android:textSize="24sp"
android:textStyle="bold" />
<EditText
android:id="@+id/date_com"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="2"
android:inputType="textPersonName"
android:textColor="@android:color/darker_gray"
android:textSize="24sp"
android:textStyle="bold"
android:background="@android:color/holo_blue_light" />
</TableRow>
117 / 167
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:padding="4dp" >
<Button
android:id="@+id/save"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Save"
android:textSize="24sp"
android:layout_weight="1" />
</LinearLayout>
</TableLayout>
<ListView
android:id="@+id/lv"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:layout_below="@id/infos" />
</RelativeLayout>
Commande.java
package ma.tdi2.gestionclientsetcommndes;
import java.sql.Time;
import java.util.Date;
public Commande() {
Id_Com = 0;
Date_Com = "";
Id_Cl = 0;
}
@Override
public String toString() {
return Id_Com + " " + Date_Com + " " + Id_Cl ;
}
VenteDatabaseManager.java
118 / 167
La même classe de gestion des clients et commandes à la fois.
SaisieCommande.java
package ma.tdi2.gestionclientsetcommndes;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.Spinner;
import android.widget.TextView;
import java.util.ArrayList;
import java.util.List;
// Remplissage du Spinner
sp = (Spinner) findViewById(R.id.sp);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
sp.setAdapter(adapter);
119 / 167
save.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
}
});
} // Fin onCreate
Exercice à faire :
Exercice 1 :
Réaliser la consultation des commandes d’un client choisi dans un spinner :
120 / 167
3 - Consulter des commandes par client.
Exercice 2 :
Réaliser la consultation des commandes de clients par ville choisie dans un spinner :
121 / 167
TP11 – Accès aux bases de données SQLite via OrmLite.
Le framework OrmLite
OrmLite est un ORM (Object-Relational Mapping : mappage relationnel objet) : c'est un
système qui permet de mettre en correspondance (le mapping) un modèle objet (modèles
orientés objet) et une base de données relationnelle. Une fois le mapping établie, il vous sera
possible de manipuler vos données sous forme d’objets metiers.
Le framework OrmLite est disponible à l'adresse suivante : http://ormlite.com/.
Pour configurer votre projet dans le but d’utiliser OrmLite, Aller dans Gradle Scripts
build.gradle : ajouter, à la fin, la ligne suivante (voir image) :
implementation 'com.j256.ormlite:ormlite-android:4.48'
122 / 167
Exercice 1 : Mise à jour d’une table Client.
MainActivity
activity_main.xml
<TableLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginTop="40dp"
android:layout_margin="10dp">
<TableRow
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="2dp">
<TextView
android:id="@+id/textView1"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:paddingLeft="6dp"
android:layout_weight="1"
android:textSize="24sp"
android:textStyle="bold"
android:textColor="@color/Fuchsia"
123 / 167
android:background="@color/GreenYellow"
android:text="Id Client :" />
<EditText
android:id="@+id/id_Cl"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:paddingLeft="6dp"
android:layout_weight="2"
android:textSize="24sp"
android:textStyle="bold"
android:textColor="@android:color/black"
android:background="@color/LightBlue"
android:inputType="textPersonName"
android:text="" />
</TableRow>
<TableRow
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="2dp" >
<TextView
android:id="@+id/textView2"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:paddingLeft="6dp"
android:layout_weight="1"
android:textSize="24sp"
android:textStyle="bold"
android:textColor="@color/Fuchsia"
android:background="@color/GreenYellow"
android:text="Nom :" />
<EditText
android:id="@+id/nom"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:paddingLeft="6dp"
android:layout_weight="2"
android:textSize="24sp"
android:textStyle="bold"
android:textColor="@android:color/black"
android:background="@color/LightBlue"
android:inputType="textPersonName"
android:text="" />
</TableRow>
<TableRow
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="2dp">
<TextView
android:id="@+id/textView3"
android:layout_width="0dp"
android:layout_height="match_parent"
android:paddingLeft="6dp"
android:layout_weight="1"
android:textSize="24sp"
android:textStyle="bold"
android:textColor="@color/Fuchsia"
android:background="@color/GreenYellow"
124 / 167
android:text="Sexe :" />
<RadioGroup
android:id="@+id/sexes"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="2"
android:textSize="24sp"
android:textStyle="bold"
android:textColor="@android:color/black"
android:background="@android:color/holo_blue_light">
<RadioButton
android:id="@+id/homme"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="18sp"
android:textStyle="bold"
android:textColor="@android:color/black"
android:background="@color/LightBlue"
android:text="Homme" />
<RadioButton
android:id="@+id/femme"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="18sp"
android:textStyle="bold"
android:textColor="@android:color/black"
android:background="@color/LightBlue"
android:text="Femme" />
</RadioGroup>
</TableRow>
<TableRow
android:layout_width="match_parent"
android:layout_height="wrap_content" >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="10dp"
android:layout_weight="1"
android:orientation="horizontal">
<Button
android:id="@+id/save"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:textSize="22sp"
android:textStyle="bold"
android:background="@color/LightGreen"
android:text="Save" />
<Button
android:id="@+id/update"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:textSize="22sp"
android:textStyle="bold"
android:background="@color/LightSkyBlue"
android:text="Update" />
<Button
125 / 167
android:id="@+id/delete"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:textSize="22sp"
android:textStyle="bold"
android:background="@color/LightSeaGreen"
android:text="Delete" />
</LinearLayout>
</TableRow>
<TableRow
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center_horizontal">
<ListView
android:id="@+id/lv"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/Orange"
android:listSelector="@color/Yellow"/>
</TableRow>
</TableLayout>
</RelativeLayout>
Client.java
package ma.tdi2.app_accsbd_sqlite_via_orm;
import com.j256.ormlite.field.DatabaseField;
import com.j256.ormlite.table.DatabaseTable;
@Override
public String toString() {
return id_Cl + " " + Nom + " " + ((Sexe=='H')? "Homme":"Femme");
}
126 / 167
DatabaseManager.java
package ma.tdi2.app_accsbd_sqlite_via_orm;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.util.Log;
import com.j256.ormlite.android.apptools.OrmLiteSqliteOpenHelper;
import com.j256.ormlite.dao.Dao;
import com.j256.ormlite.support.ConnectionSource;
import com.j256.ormlite.table.TableUtils;
import java.util.List;
// Database name
private static final String DATABASE_NAME = "Vente.db";
@Override
public void onCreate(SQLiteDatabase database, ConnectionSource connectionSource) {
try {
TableUtils.createTable(connectionSource,Client.class);
Log.i("DATABASE", "onCreate: ");
} catch (Exception exception)
{
Log.e("DATABASE", "Pb onCreate: ");
}
@Override
public void onUpgrade(SQLiteDatabase database, ConnectionSource connectionSource, int
oldVersion, int newVersion) {
try {
TableUtils.dropTable(connectionSource,Client.class,true);
onCreate(database,connectionSource);
Log.i("DATABASE", "onUpgrade: ");
} catch (Exception exception)
{
Log.e("DATABASE", "Pb onUpgrade: ");
}
127 / 167
Log.e("DATABASE", "Pb insert: ");
}
DAO signifie Data Access Object et fournit toutes les fonctionnalités de la gestion d'une seule
classe persistante.
DAO est le noyau de OrmLite.
MainActivity.java
package ma.tdi2.app_accsbd_sqlite_via_orm;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
128 / 167
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import androidx.appcompat.app.AppCompatActivity;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
cl = new Client();
cl.id_Cl = Integer.parseInt(id_Cl.getText().toString());
cl.Nom = nom.getText().toString();
switch (sexes.getCheckedRadioButtonId()) {
case R.id.homme:
cl.Sexe = 'H';
break;
case R.id.femme:
cl.Sexe = 'F';
break;
}
// Effacer le formulaire
Effacer();
}
});
129 / 167
homme = (RadioButton)findViewById(R.id.homme);
femme = (RadioButton)findViewById(R.id.femme);
lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long
id) {
cl = maBD.getAllClient().get(position);
id_Cl.setText(String.valueOf(cl.id_Cl));
nom.setText(cl.Nom);
if (cl.Sexe == 'H')
{
homme.setChecked(true);
} else
{
femme.setChecked(true);
}
k = position; // pour se rappeler de la position du client dans lv
}
});
delete = (Button)findViewById(R.id.delete);
delete.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
cl = maBD.getAllClient().get(k);
maBD.removeClient(cl);
Afficher();
Effacer();
}
});
update = (Button)findViewById(R.id.update);
update.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
cl = maBD.getAllClient().get(k);
// cl.id_Cl = Integer.parseInt(id_Cl.getText().toString());
cl.Nom = nom.getText().toString();
switch (sexes.getCheckedRadioButtonId()) {
case R.id.homme:
cl.Sexe = 'H';
break;
case R.id.femme:
cl.Sexe = 'F';
break;
}
maBD.updateClient(cl);
Afficher();
}
});
} // Fin onCreate
130 / 167
public void Afficher()
{
// Afficher dans la ListView
adapter = new
ArrayAdapter<Client>(getApplicationContext(),android.R.layout.simple_list_item_1,maBD.getAllClient())
;
lv.setAdapter(adapter);
}
Ajout
Selection
131 / 167
Exercice 2 : Mise à jour de deux tables Client et Commande (OrmLite).
1 - Menu.
MajClient_ListView
activity_gestion_client.xml
132 / 167
android:background="@drawable/image22"
tools:context=".GestionClient">
<TableLayout
android:id="@+id/infos"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:layout_alignParentTop="true">
<TableRow
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="4dp" >
<TextView
android:id="@+id/textView1"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="Id_Cl :"
android:textColor="@android:color/black"
android:textSize="24sp"
android:textStyle="bold" />
<EditText
android:id="@+id/id_Cl"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="2"
android:inputType="textPersonName"
android:textColor="@android:color/black"
android:textSize="24sp"
android:textStyle="bold"
android:background="@android:color/holo_blue_light" />
</TableRow>
<TableRow
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="4dp" >
<TextView
android:id="@+id/textView2"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="Nom :"
android:textColor="@android:color/black"
android:textSize="24sp"
android:textStyle="bold" />
<EditText
android:id="@+id/nom"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="2"
android:ems="10"
android:inputType="textPersonName"
android:textColor="@android:color/black"
android:textSize="24sp"
android:textStyle="bold"
android:background="@android:color/holo_blue_light" />
133 / 167
</TableRow>
<TableRow
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="4dp" >
<TextView
android:id="@+id/textView3"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="Ville :"
android:textColor="@android:color/black"
android:textSize="24sp"
android:textStyle="bold" />
<EditText
android:id="@+id/ville"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="2"
android:inputType="textPersonName"
android:textColor="@android:color/black"
android:textSize="24sp"
android:textStyle="bold"
android:background="@android:color/holo_blue_light" />
</TableRow>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:padding="4dp" >
<Button
android:id="@+id/save"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text="Save"
android:textSize="24sp"
android:layout_weight="1" />
<Button
android:id="@+id/update"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text="Update"
android:textSize="24sp"
android:layout_weight="1" />
<Button
android:id="@+id/delete"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text="Delete"
android:textSize="24sp"
android:layout_weight="1" />
</LinearLayout>
134 / 167
</TableLayout>
<ListView
android:id="@+id/lv"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="4dp"
android:layout_below="@id/infos" />
</RelativeLayout>
Client.java
package ma.tdi2.gestioncommerciale_sqlite_via_ormlite;
import com.j256.ormlite.field.DatabaseField;
import com.j256.ormlite.table.DatabaseTable;
public Client() {
}
@Override
public String toString() {
return id_Cl + " " + Nom + " " + Ville;
}
DatabaseManager.java
package ma.tdi2.gestioncommerciale_sqlite_via_ormlite;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.util.Log;
import com.j256.ormlite.android.apptools.OrmLiteSqliteOpenHelper;
import com.j256.ormlite.dao.Dao;
import com.j256.ormlite.support.ConnectionSource;
import com.j256.ormlite.table.TableUtils;
import java.util.List;
135 / 167
public class DatabaseManager extends OrmLiteSqliteOpenHelper {
// Database name
private static final String DATABASE_NAME = "Vente.db";
@Override
public void onCreate(SQLiteDatabase database, ConnectionSource connectionSource) {
try {
TableUtils.createTable(connectionSource,Client.class);
TableUtils.createTable(connectionSource,Commande.class);
Log.i("DATABASE", "onCreate: ");
} catch (Exception exception)
{
Log.e("DATABASE", "Pb onCreate: ");
}
@Override
public void onUpgrade(SQLiteDatabase database, ConnectionSource connectionSource, int
oldVersion, int newVersion) {
try {
TableUtils.dropTable(connectionSource,Commande.class,true);
TableUtils.dropTable(connectionSource,Client.class,true);
onCreate(database,connectionSource);
Log.i("DATABASE", "onUpgrade: ");
} catch (Exception exception)
{
Log.e("DATABASE", "Pb onUpgrade: ");
}
136 / 167
}
GestionClient.java
package ma.tdi2.gestioncommerciale_sqlite_via_ormlite;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
137 / 167
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_gestion_client);
cl = new Client();
cl.id_Cl = Integer.parseInt(id_Cl.getText().toString());
cl.Nom = nom.getText().toString();
cl.Ville = ville.getText().toString();
// Effacer le formulaire
Effacer();
}
});
lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long
id) {
cl = maBD.getAllClient().get(position);
id_Cl.setText(String.valueOf(cl.id_Cl));
nom.setText(cl.Nom);
ville.setText(cl.Ville);
138 / 167
k = position;
}
});
delete = (Button)findViewById(R.id.delete);
delete.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
cl = maBD.getAllClient().get(k);
maBD.removeClient(cl);
Afficher();
Effacer();
}
});
update = (Button)findViewById(R.id.update);
update.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
cl = maBD.getAllClient().get(k);
// cl.id_Cl = Integer.parseInt(id_Cl.getText().toString());
cl.Nom = nom.getText().toString();
cl.Ville = ville.getText().toString();
maBD.updateClient(cl);
Afficher();
}
});
} // Fin onCreate
139 / 167
3 - Mise à jour de la table Commande.
GestionCommande (Activity) :
activity_gestion_commande.xml
<TableLayout
android:id="@+id/infos"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:layout_alignParentTop="true">
<TableRow
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="4dp">
<TextView
android:id="@+id/textView1"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="Id Client :"
android:textColor="@android:color/black"
android:textSize="24sp"
android:textStyle="bold" />
<Spinner
android:id="@+id/sp"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="2"
android:background="@android:color/holo_blue_light"
android:popupBackground="@android:color/holo_green_light"
android:dropDownSelector="@android:color/holo_orange_light"
android:spinnerMode="dropdown" />
</TableRow>
<TableRow
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="4dp" >
<TextView
android:id="@+id/textView2"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="Id Com :"
android:textColor="@android:color/black"
android:textSize="24sp"
android:textStyle="bold" />
<EditText
android:id="@+id/id_com"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="2"
android:inputType="textPersonName"
android:textColor="@android:color/black"
android:textSize="24sp"
android:textStyle="bold"
android:background="@android:color/holo_blue_light" />
</TableRow>
141 / 167
<TableRow
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="4dp">
<TextView
android:id="@+id/textView3"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="Date :"
android:textColor="@android:color/black"
android:textSize="24sp"
android:textStyle="bold" />
<EditText
android:id="@+id/date_com"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="2"
android:inputType="textPersonName"
android:textColor="@android:color/black"
android:textSize="24sp"
android:textStyle="bold"
android:background="@android:color/holo_blue_light" />
</TableRow>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:padding="4dp" >
<Button
android:id="@+id/save"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text="Save"
android:textSize="24sp"
android:layout_weight="1" />
<Button
android:id="@+id/update"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text="Update"
android:textSize="24sp"
android:layout_weight="1" />
<Button
android:id="@+id/delete"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text="Delete"
android:textSize="24sp"
android:layout_weight="1" />
</LinearLayout>
</TableLayout>
<ListView
142 / 167
android:id="@+id/lv"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:layout_below="@id/infos" />
</RelativeLayout>
Commande.java
package ma.tdi2.gestioncommerciale_sqlite_via_ormlite;
import com.j256.ormlite.field.DatabaseField;
import com.j256.ormlite.table.DatabaseTable;
public Commande() {
}
@Override
public String toString() {
return Id_Com + " " + Date_Com + " " + client.Nom ;
}
VDatabaseManager.java
. . .
143 / 167
}
GestionCommande.java
package ma.tdi2.gestioncommerciale_sqlite_via_ormlite;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.Spinner;
import android.widget.TextView;
import java.util.ArrayList;
import java.util.List;
144 / 167
public Spinner sp;
public ListView lv;
public Commande com;
public ArrayAdapter adapter;
public List list;
public int k;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_gestion_commande);
// Remplissage du Spinner
sp = (Spinner) findViewById(R.id.sp);
}
});
delete = (Button)findViewById(R.id.delete);
delete.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
145 / 167
com = maBD.getAllCommande().get(k);
maBD.removeCommande(com);
Afficher();
Effacer();
}
});
update = (Button)findViewById(R.id.update);
update.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
com = maBD.getAllCommande().get(k);
// com.Id_Com = Integer.parseInt(id_com.getText().toString());
com.Date_Com = date_com.getText().toString();
com.client = maBD.getClient(sp.getSelectedItem().toString());
maBD.updateCommande(com);
Afficher();
}
});
} // Fin onCreate
Exercice à faire :
Exercice 1 :
Réaliser la consultation des commandes d’un client choisi dans un spinner :
146 / 167
3 - Consulter des commandes par client.
Exercice 2 :
Réaliser la consultation des commandes de clients par ville choisie dans un spinner :
147 / 167
TP12 – Manipulation des données d’un fichier JSON.
Définitions et règles :
JSON :
JSON : (JavaScript Object Notation)
JSON est un langage de stockage et d'échange de données.
JSON est plus facile à utiliser que XML. (JSON est une alternative à XML)
JSON est un langage léger et structuré.
{
"employes": [
{
"prenom": "Ali",
"age": 30,
"mail": "ali@gmail.com"
},
{
"prenom": "Omar",
"age": 25,
"mail": "omar@gmail.com"
},
{
"prenom": "Walid",
"age": 22,
"mail": "walid@gmail.com"
}
]
}
<employes>
<employe>
<prenom>Ali</prenom>
<age>30</age>
<mail>ali@gmail.com</mail>
</employe>
<employe>
<prenom>Omar</prenom>
<age>25</age>
<mail>omar@gmail.com</mail>
</employe>
<employe>
<prenom>Ali</prenom>
<age>22</age>
<mail>walid@gmail.com</mail>
</employe>
148 / 167
</employes>
Règles de syntaxe :
{...} : les accolades définissent un objet json (JSONObject).
"prenom": "Ali" : Les guillemets (double-quotes) et les double-points définissent
un couple clé/valeur (key/value).
[...] : Les crochets définissent un tableau json (JSONArray).
{"prenom":"Ali","age":30,"mail":"ali@gmail.com"} : Les virgules permettent de
séparer les éléments d'un d'un objet ou tableau.
Noter qu’il n’y a pas de virgule pour le dernier élément d'un objet, sinon, il ne sera pas
valide et vous aurez des erreurs lors de l'analyse du fichier.
"employes" : [. . .] est un tableau Json : JSONArray, dont les éléments sont des objets
JSONObject.
{
"etudiants": [
{
"nom": "Alami",
"prenom": "Rachid",
"Adresse": {
"rue": "10 Rue X",
"ville": "Fes"
},
"loisirs": ["Sport","Voyage"]
},
{
"nom": "Naji",
"prenom": "Ahmed",
"Adresse": {
"rue": "20 Rue Y",
149 / 167
"ville": "Casa"
},
"loisirs": ["Gaming","Lecture"]
},
{
"nom": "Wahbi",
"prenom": "Sanae",
"Adresse": {
"rue": "30 Rue Z",
"ville": "Fes"
},
"loisirs": ["Sport","Cuisine",","Jeux"]
}
]
}
{
"emp1": {
"prenom": "Ali",
"age": 30,
"mail": "ali@gmail.com"
},
"emp2": {
"prenom": "Omar",
"age": 25,
"mail": "omar@gmail.com"
},
"emp3": {
"prenom": "Walid",
"age": 22,
"mail": "walid@gmail.com"
}
}
{
"employes": [
{
"prenom": "Ali",
"age": 30,
"mail": "ali@gmail.com"
},
{
"prenom": "Omar",
"age": 25,
"mail": "omar@gmail.com"
},
{
150 / 167
"prenom": "Walid",
"age": 22,
"mail": "walid@gmail.com"
}
]
}
Par conséquent, on peut accéder aux différents éléments du tableau par leurs indices :
Configuration : pour pouvoir travailler avec des données en format Json, il faudra
ajouter la ligne suivante au fichier AndroidManifest.xml de votre projet :
<uses-permission android:name="android.permission.INTERNET"/>
MainActivity
151 / 167
activity_main.xml
<TextView
android:id="@+id/textView1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_marginTop="40dp"
android:textColor="@android:color/black"
android:textSize="24sp"
android:textStyle="bold"
android:background="@android:color/holo_blue_light" />
<TextView
android:id="@+id/textView2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_marginTop="200dp"
android:textColor="@android:color/black"
android:textSize="24sp"
android:textStyle="bold"
android:background="@android:color/holo_green_light"/>
<TextView
android:id="@+id/textView3"
android:layout_width="match_parent"
152 / 167
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_marginTop="300dp"
android:textColor="@android:color/black"
android:textSize="24sp"
android:textStyle="bold"
android:background="@android:color/holo_blue_bright"/>
</RelativeLayout>
MainActivity.java
package ma.tdi2.app_testjson;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
strData = "{\n" +
" \"employes\": [\n" +
" {\n" +
" \"prenom\": \"Ali\",\n" +
" \"age\": 30,\n" +
" \"mail\": \"ali@gmail.com\"\n" +
" },\n" +
" {\n" +
" \"prenom\": \"Omar\",\n" +
" \"age\": 25,\n" +
" \"mail\": \"omar@gmail.com\"\n" +
" },\n" +
" {\n" +
" \"prenom\": \"Walid\",\n" +
" \"age\": 22,\n" +
" \"mail\": \"walid@gmail.com\"\n" +
" },\n" +
" ]\n" +
" }\n";
try {
// L'objet json principal (racine)
jsonObj = new JSONObject(strData);
} catch (JSONException e){
153 / 167
e.printStackTrace();
}
textView1.setText(jsonObj.toString());
try {
jsonarray = jsonObj.getJSONArray("employes");
textView2.setText(jsonarray.getJSONObject(0).toString());
textView3.setText(jsonarray.getJSONObject(0).getString("prenom")
+ " --> " + jsonarray.getJSONObject(0).getInt("age")
+ " --> " + jsonarray.getJSONObject(0).getString("mail"));
} // Fin onCreate
Exercice à faire :
Exercice 1 :
Refaire le même travail avec le fichier du deuxième exemple :
{
"etudiants": [
. . .
]
}
Afficher dans un TextView le nom, prénom, la ville et le 1er des loisirs d’un étudiant choisi
parmi les étudiants du tableau "etudiants".
154 / 167
Exercice 2 : Ecriture et de lecture dans un fichier .json .
Lecture du fichier :
155 / 167
Methodes pour ajouter, modifier et supprimer des objets Json dans un
fichier Json :
{
"employes": [
{
"prenom": "Ali",
"age": 30,
"mail": "ali@gmail.com"
},
{
"prenom": "Omar",
"age": 25,
"mail": "omar@gmail.com"
},
{
"prenom": "Walid",
"age": 22,
"mail": "walid@gmail.com"
}
]
}
Avec:
String strData;
JSONArray jsonarray;
JSONObject jsonObj,jsonObjEmp;
jsonarray = jsonObj.getJSONArray("employes");
jsonarray.put(jsonObjEmp);
156 / 167
mainObject = {"clients":[{Emp1}, {Emp2}, {Emp3}, {Emp4}]}
strData = mainObject.toString()
jsonarray = jsonObj.getJSONArray("employes");
strData = mainObject.toString()
jsonarray.remove(2);
mainObject = new JSONObject();
mainObject.put("clients", jsonarray);
strData = mainObject.toString()
MainActivity
157 / 167
activity_main.xml
Client.java
DatabaseManager.java
MainActivity.java
Ajout
Client.json
{"clients":[
{"id_Cl":1,"Nom":"Alami","Ville":"Casa"},
{"id_Cl":2,"Nom":"Naji","Ville":"Casa"},
{"id_Cl":3,"Nom":"Wahbi","Ville":"Fes"},
{"id_Cl":4,"Nom":"Talbi","Ville":"Rabat"}
]}
158 / 167
Public List<Client> JsonToList(JSONObject jsobj)
Afficher(List lst)
TEXT. The value is a text string, stored using the database encoding
(UTF-8, UTF-16BE or UTF-16LE).
SQLite does not have a separate Boolean storage class. Instead, Boolean
values are stored as integers 0 (false) and 1 (true).
SQLite does not have a storage class set aside for storing dates and/or
times. Instead, the built-in Date And Time Functions of SQLite are
capable of storing dates and times as TEXT, REAL, or INTEGER values:
159 / 167
TEXT as ISO8601 strings ("YYYY-MM-DD HH:MM:SS.SSS").
REAL as Julian day numbers, the number of days since noon in
Greenwich on November 24, 4714 B.C. according to the proleptic
Gregorian calendar.
INTEGER as Unix Time, the number of seconds since 1970-01-01
00:00:00 UTC.
Applications can chose to store dates and times in any of these formats
and freely convert between formats using the built-in date and time
functions.
Cours - Compléments
Syntax
variable = (condition) ? expressionTrue : expressionFalse;
Instead of writing:
160 / 167
Example
int time = 20;
if (time < 18) {
System.out.println("Good day.");
} else {
System.out.println("Good evening.");
}
Run example »
Example
int time = 20;
String result = (time < 18) ? "Good day." : "Good evening.";
System.out.println(result);
Lexique
Concepts de base
Dans ce premier article consacré au développement d'une application sous Android, on abordera
les fondamenteaux de ce domaine. On expliquera ce qui est Context, Intent, Bundle et Activity.
Cette dernière notion est sans doute la plus importante. On verra pourquoi plus loin.
Qu'est-ce que c'est Activity sous Android ?
Activity peut être traduit en mot "activité". En analogie avec le monde des applications web, on peut dire qu'elle
est une page web. Elle représente une chose que l'utilisateur peut faire à un moment donné.
161 / 167
Les activités sont gérées dans une pile d'activités. Chaque fois où une nouvelle activité est lancée, elle arrive à
la première position de la pile et devient l'activité qui est actuellement exécutée. L'activité précédente reste
dans la pile et ne pourra pas être lancée une fois la première activitée terminée.
L'activité est représentée par la classe Activity dont 7 méthodes illustrent le cycle de vie qu'elle peut prendre :
- onCreate : la méthode d'initialisation des vues, des paramètres et d'autres données. Elle prend en paramètre
l'instance de la classe Bundle qu'on présentera plus loin dans l'article.
- onStart : appelée quand l'activité est rendue visible à l'utilisateur.
- onRestart : appelée à un nouveau démarrage de la même activité (quand l'activité était arrêtée)
- onResume : appelée quand l'activité commence à interagir avec l'utilisateur.
- onPause : méthode qui sert à arrêter une activité temporairement.
- onStop : cette fonction est utilisée quand l'activité n'est plus visible à l'utilisateur. Elle est cachée soit à cause
d'une nouvelle activité lancée, soit parce que l'activité en cours s'apprête à être détruite.
- onDestroy : est invoquée quand l'activité est détruite. La destruction opère quand quelqu'un appele la
méthode finish() ou quand c'est le système qui décide de tuer l'activité pour économiser de l'espace.
TODO : présenter d'une manière plus interactive
Qu'est-ce que c'est Bundle sous Android ?
Dans le paragraphe précédent on a mentionné l'existence d'un paramètre passé à la méthode onCreate. Il
s'agitssait de l'instance de la classe Bundle.
Cette classe est une sorte de conteneur pour les données transmissibles d'une activité à l'autre. Elle permet de
récupérer tout type de données : long, char, ArrayList ...
Mais attention, c'est une des 2 méthodes de transmission de données. L'autre se base sur les données stockées
dans des intentions.
Qu'est-ce que c'est Intent sous Android ?
Les intentions sont des opérations qui permettent, entre autres, de naviguer entre les écrans. Grâce à elles on
peut également passer des paramètres d'un écran à l'autre de notre application. C'est d'ailleurs cette méthode
de passage qu'on utilisera dans notre exemple d'application développée sous Android.
Cependant, la navigation n'est pas la seule fonctionnalité des intentions. L'autre, aussi importante, est la
possibilité d'écouter et de réagir à des événements extérieurs à l'application. Par exemple, grâce à des
intentions, on peut capter le moment où notre connexion WiFi n'est plus disponible et exécuter une action dans
notre application. On utilisera pour cela les broadcast receivers sous Android, qu'on abordera plus loin dans la
série.
Une intention est donc définie par :
- une liste d'événements auxquels elle doit répondre
- un composant de l'application qui doit s'occuper de gérer l'événement capté
On distingue deux type d'intentions :
- explicite : on sait quelle activité on veut démarrer (par exemple pour passer à une activité "ShowSite" après le
click sur le bouton "afficher le site")
- implicite : on ne sait pas quelle activité doit être invoquée. En occurrence, c'est Android qui va se charger de
trouver l'activité adéquate à lancer (par exemple pour consulter un site web, il va lancer un des navigateurs
disponibles).
Les intentions sont accompagnés de filtres. Ils regroupent des conditions que doit remplir une activité ou un
broadcast receiver pour être exécuté.
Qu'est-ce que c'est Context sous Android ?
Essentiellement, un Context est une référence à des ressources gérées par l'application. Il permet également de
récupérer les informations sur le système. Il fournit aussi l'accès à des services de l'Android.
Le contexte permet aussi de gérer d'autres aspects de l'application. Il doit d'ailleurs être employé pour pouvoir
lancer une nouvelle activité, réceptionner les intentions ou écouter les événements. Voici les exemples plus
précis :
- création de nouveaux objets (TextView, Adapter...)
- accès à des ressources (String, Array...)
- accès implicit à des components (par
exemple getApplicationContext().getContentResolver()pour content resolver)
162 / 167
Comment récupérer le contexte ? Une des 4 méthodes le permet :
- getApplicationContext()
- getContext()
- getBaseContext()
- this - mais disponible uniquement quand on récupère le contexte depuis une activité
Qu'est-ce que c'est Service sous Android ?
Dans la définition du contexte, on a abordé l'existence des services. Les services sont des tâches qui peuvent
être lancées avec ou sans intervention de l'utilisateur. Elles s'exécutent dans le background de l'application et
peuvent se terminer soit après la finalisation de la tâche, soit à travers une intervention externe. Les services
représentent également une fonctionnalité d'une application exposée à d'autres applications. Il est important de
mentionner que le service ne fournit pas d'interface graphique (User Interface).
Un service concret hérite de la classe Service et surcharge des méthodes suivantes :
- onStartCommand : si un autre component (par exemple une activité) fait appel à un service
via startService(), c'est la méthode onStartCommande du service qui est appelée en premier.
- onBind : pareil qu'onStartCommand. La seule différence repose dans le fait que cette méthode est appelée
quand un autre component appelle le service avec bindService(). onBind doit retourner nullsi l'on souhaite que
l'invocation du service depuis une autre application soit impossible.
- onCreate : elle est appelée après onStartCommand ou onBind. Cette méthode contient toutes les procédures
nécessaires à l'initialisation du service.
- onDestroy : cette fonction est invoquée quand l'exécution du service doit être terminée. L'implémentation de
cette méthode est nécessaire car chaque fin de l'exécution libère des ressources de l'Android.
Qu'est-ce que c'est Broadcast Receiver sous Android ?
A l'ocassion du chapitre consacré à des intentions on a brièvement présenté les broadcast receivers. Ici, on les
développera un peu plus. Pour commencer, quelle définition on pourrait donner à des broadcast receivers ? Ce
sont des classes implémentant BroadcastReceiver qui reçoivent des intentions et effectuent des actions
spécifiques.
Ils vivent uniquement le temps qui est nécessaire pour traiter l'intention. Le traitement s'effectue dans la
méthode onReceive() qui prend en paramètre les instances du Context et de l'Intent.
Les broadcast receivers sont destinés à exécuter de petites tâches, comme l'envoi d'une nouvelle localisation
GPS, traitement rapide d'un mail envoyé. Android attribue à des broadcast receivers un laps de temps (10
seconds) dans lequel la tâche définie doit être terminée. Si au bout de ce temps le traitement n'est pas terminé,
le broadcast receiver est immédiatement disponible à être tué si l'application a besoin de plus de mémoire.
Donc, ils ne sont pas adaptés à des tâches dont la durée est indéterminée ou très longue (plus que 10
seconds). Dans ce cas de figure on utilisera la conjonction du Service à broadcast receiver.
Qu'est-ce que c'est Content Provider sous Android ?
Certaines données d'une application doivent être partagées avec d'autres application. C'est le cas par exemple
d'un carnet d'adresses qui peut être facilement utilisée par d'autres application pour pouvoir, par exemple,
envoyer un SMS à un de ses contacts. Sous le principe de partage se cache la notion du Content Provider.
L'accès à ces données se fait via l'instance de la classe ContentResolver. Elle permet d'effectuer toutes les
opérations CRUD (create, retreive, update, delete).
Dans cette partie on a vu les fondamentaux d'une application Android. Les chapitres suivants les présenteront
plus en détail et, surtout, plus en pratique.
Cod en Vrac :
163 / 167
164 / 167
Exercice :
165 / 167
166 / 167
Pour configurer Android Studio de façon à ce qu’il travaille offline :
monadapter
DataSource La Vue
listClient ListView
Client1
Objets Client Client2 Cellules
Client3
Client4
167 / 167