Vous êtes sur la page 1sur 167

OFPPT

Direction Régionale Centre Nord


ISTA Route Imouzzer Fès

Technicien en Techniques de Développement Informatique

Guide des travaux pratiques

Module 205 :

Développement d'applications mobiles

Android Studio
et

Java

Hamid Mask
Formateur en TDI

1 / 167
Créez des applications pour Android

I – Importance des applications mobiles :


Il suffit de constater que plus que 90 % du matériel digital utilisé par les individus est le
téléphone mobile. Toutes sortes de services publiques ou privés sont maintenant disponibles à
travers des applications mobiles.

I - Installation et configuration des outils


1 – Le matériel :
Il faut vérifier que votre machine de développement possède :

 RAM 4 Go (fonctionnement lourd). 8 Go recommandé.


 Disque 6 Go.
 CPU : Minimum i5.

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.

3 – Le Java Development Kit (JDK)

Pour développer en Java, nous devons installer le JDK (pour «Java Development Kit»).

Il existe deux plateformes en Java :

 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.

4 – Téléchargement et installation du JDK :

Voici le lien de téléchargement :


http://www.oracle.com/technetwork/java/javase/downloads/index.html

Cliquez sur Download en dessous de JDK :

2 / 167
Cliquez sur (Accept License Agreement) avant de continuer.

Choisissez ensuite la version adaptée à votre configuration. Une fois le téléchargement


terminé, vous pouvez l’installer.

5 – Téléchargement et installation d’Android Studio et le SDK Android :

On va maintenant télécharger un pack (fichier) qui contient Android Studio et un outil


pour gérer l'installation du SDK Android sur votre système.

Android Studio est un environnement de développement (EDI) spécialisé dans le


développement d'applications Android. C’est l'IDE fabriqué et privilégié par Google pour le
développement Android.

Voici le lien de téléchargement :


https://developer.android.com/sdk/installing/studio.html

Cliquez sur Download Android Studio pour démarrer le téléchargement :

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.

Un SDK, un kit de développement, est un ensemble d'outils permettant de développer pour un


type d’appareil particulier. Par exemple pour développer pour une console de jeu vidéo, on
utilise un SDK spécifique pour développer des applications pour cette console.

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.

5 – Création de votre premier projet :

Dans la fenêtre Android Studio cliquez sur Start a new Android Studio Project pour
ouvrir l'assistant de création de projet.

Cliquez sur Start a new Android Studio Project

Une nouvelle fenêtre s'ouvrira. Elle contient trois champs :

C’est la première étape de création d'un projet

7 / 167
1. Application Name : c’est le nom qui apparaîtra sur l'appareil et sur Google Play.

2. Company Domain : c’est le nom de domaine de votre entreprise (Exemples :


tdi2.com ou Mask.ma).

 Project Location : indiquez ici l'emplacement où les fichiers de votre projet seront
créés.

Cliquez sur Next pour passer à l'écran suivant.

Cet écran vous permet de sélectionner le matériel de destination de votre application,


ainsi que la version d'Android minimum que doit utiliser ce matériel. Sélectionnez la version la
plus récente.

Une fois votre sélection faites, cliquez sur Next.

8 / 167
Création de la première activité.

Sélectionnez Empty Activity et cliquez sur Next.

Ce sont des informations sur la première activité (écran) de notre application.

Cliquez juste sur Finish .

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.

II – Configuration du téléphone (Appareil réel).


Votre téléphone doit être configuré de façon à ce qu’il puisse exécuter des applications que vous avez
développé. Pour cela, allez dans les paramètres du téléphone :

 Choisissez l'option :
Options de développement

 Activer l'option Débogage USB

Si Options de développement n’apparait pas allez dans :


Paramètres  A propos de l’appareil et appuyer sur Numéro de version trois fois.
Retournez ensuite à l’écran Paramètres, vous verrez apparaitre Options de développement.

Avec un smartphone Huawei ou Honor sous EMUI


Paramètres  Plus de paramètres  Système  A propos du téléphone et appuyer sur Numéro
de build 7 fois.
Retournez ensuite à l’écran Système, vous verrez apparaitre 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.

1 - Qu'est-ce qu'une activité ?

Si vous observez l’architecture de la majorité des applications Android, vous


remarquerez qu’elles sont structurées à peu près de la même façon. Une application est un
assemblage de fenêtres entre lesquelles il est possible de naviguer.

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.

En cliquant sur un élément de la liste à gauche, on ouvre une nouvelle activité.

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.

Context = l’ensemble des ressources utilisées.


Une activité est constituée du contexte de l'application et d'une seule et unique interface
graphique.

2 - États d'une activité

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 :

Fonctionnement de la pile d'activités


L'activité que voit l'utilisateur est celle qui se trouve au sommet de la pile. Ainsi,
lorsqu'un appel (ou un message) arrive, il se place au sommet de la pile et c'est lui qui
s'affiche à la place de votre application, qui n'est plus qu'à la deuxième place. Votre activité ne
reviendra qu'à partir du moment où toutes les activités qui se trouvent au-dessus d'elle seront
arrêtées et sorties de la pile. On retrouve ainsi le principe expliqué précédemment, on ne peut
avoir qu'une application visible en même temps sur le terminal, et ce qui est visible est
l'interface graphique de l'activité qui se trouve au sommet de la pile.

Une activité peut se trouver dans les trois états suivants :


 Actif (Active) : L'activité est visible en totalité. C'est ce que l'utilisateur consulte en ce
moment même.
 Suspendu (Paused) : L'activité est partiellement visible à l'écran. C'est le cas quand
vous recevez un SMS. L'utilisateur devra se débarrasser de l'application partiellement
au-dessus pour qu’il puisse à nouveau interagir avec la première activité.

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.

3 - Cycle de vie d'une activité

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.

Cycle de vie d'une activité

Qui peut être représenté aussi de la manière suivante :

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.

 Destroyed : l’activité est détruite par le système et n’existe plus.

Les activités héritent de la classe Activity.


On les trouve dans le package android.app.Activity.

Un package = un espace de nom.

4 - Création d’une machine virtuelle (ou émulateur).

 Aller au menu :
Tools  Android  AVD Manager

 Ou bien Cliquez sur l’icône :

14 / 167
Cliquez sur le bouton Create Virtual Device en bas de l'écran :

Écran de sélection du matériel à émuler

On a choisi de créer un équipement qui correspondra à un Nexus 5, on le sélectionne donc


dans le menu central et on clique sur Next.

15 / 167
Nous pouvons sélectionner ici une version d'Android à installer sur notre AVD

Les derniers paramètres pour notre AVD

Enfin, nous allons pouvoir sélectionner les derniers paramètres pour notre AVD. Nous gardons
toutes les valeurs proposées.

 Cliquer sur Finish directement.

16 / 167
Notre machine virtuelle a été créée avec succès.

17 / 167
V – Exemples d’applications simples.

1 – Hello World !

 Choisisser New Project :


Application name : PremiereApplication
Campany domain : tdi2.ma

Le Manifeste : AndroidManifest.xml (ensemble d’informations sur l’application).

MainActivity (Class Java)

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 :

MainActivity contient les Views (Widgets) suivants :

 Un TextBox : editText1
 Un Bouton : buttonCopier
 Un label : textView1

Le code Java sera écrit presque toujours dans la procedure événémentielle onCreate :

protected void onCreate(Bundle savedInstanceState) {

// Metttre du code java ici

21 / 167
22 / 167
V – TPs d’initiation.

TP1 – Compter les clics : TextView – 2 Buttons


 Choisisser New Project :
Application name : Application-02
Campany domain : tdi2.ma

Le Layout : nous avons utilisé un RelativeLayout pour placer les Views les unes après les
autres.

MainActivity contient les Views (Widgets) suivants :

 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;

public class MainActivity extends AppCompatActivity {

Button btnClick;
Button btnReset;
TextView txt;

23 / 167
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

btnClick = (Button) findViewById(R.id.buttonClick);


btnReset = (Button) findViewById(R.id.buttonReset);

txt = (TextView) findViewById(R.id.textView);

btnClick.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {

int Cpt = Integer.parseInt(txt.getText().toString());


Cpt++;
txt.setText(String.valueOf(Cpt));
}
});

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.

Expression du dp en fonction du pixel :


dp = px * 160 / dpi

25 / 167
Quoi utiliser sp ou dp ?
Utilisez sp pour la taille du texte.
Utilisez dp pour tout le reste.

TP2 – Scores des deux équipes d’un match de Basket.


A faire à titre d’exercice :

26 / 167
27 / 167
TP3 – Nombres aléatoires : Générer des nombres aléatoires à l’aide de
la fonction Random().

Etape 1 : Générer des nombres aléatoires (Entre 0 et 100).

 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.

MainActivity contient les Views (Widgets) suivants :

 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;

public class MainActivity extends AppCompatActivity {

TextView txtResultat;
Button btnOK;
28 / 167
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

txtResultat = (TextView) findViewById(R.id.textView1);


btnOK = (Button) findViewById(R.id.buttonOK);

btnOK.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int valeur = (int) (Math.random()*100);
txtResultat.setText(Integer.toString(valeur));
}
});

}
}

Exécution de l’application : l’application génère bien des nombres aléatoires.

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;

public class MainActivity extends AppCompatActivity {

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);

txtResultat = (TextView) findViewById(R.id.textView1);


btnOK = (Button) findViewById(R.id.buttonOK);
edTSaisie = (EditText) findViewById(R.id.editTextSaisie);
valeur = (int) (Math.random()*100); // Valeur aléatoire fixe

btnOK.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {

int valeurSaisie = Integer.parseInt(edTSaisie.getText().toString());

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.

 Ajouter les Views suivants :


 Deux TextView(s) : textView1 et textView2
 Un ImageView : Jeu

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 :

<string name="Welcome">Bienvenue sur mon application</string>


<string name="Hello">Hello World!</string>

Vous pouvez générer un string en se plaçant dans la chaine de caractère et appuyant sur
Ctrl + Entrée.

Puis nommer la ressource Welcome et cliquer sur OK :

 Modifier le Texte des deux textViews dans le fichier activity_main.xml :

<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 :

Etape 2 : Créer une deuxième activité CookieActivity.

 File  New  New Activity  Empty Activity :

Activity name : CookieActivity


Layout name : activity_cookie
Package name : ma.tdi2.deuxactivites

 Ajouter un RelativeLayout à cette activité.


 Ajouter à l’intérieur de ce Layout les Views suivants :

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 :

<string name="Point_Nb">Points : </string>

 Ouvrer le fichier color.xml (app  res  values) et ajouter une couleur :

<color name="White">#fff</color>

 Modifier le texte du textView et sa couleur dans le fichier activity_cookie.xml :

<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;

public class MainActivity extends AppCompatActivity {

private ImageView jeu;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

jeu = (ImageView) findViewById(R.id.Jeu);

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.

Pour réaliser cela, ajouter le code suivant :

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;

public class CookieActivity extends AppCompatActivity {


private TextView points;
private ImageView cookie;
private int clicks = 0;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_cookie);

points = (TextView) findViewById(R.id.points);


cookie = (ImageView) findViewById(R.id.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.

Cas 1 : Menu simple.

Design Run Run

40 / 167
content_main (Design du Basic Actvity)

<?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"
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="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 . . .

public class MainActivity extends AppCompatActivity {

@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);
}
}

Cas 2 : orderInCategory pour changer l’ordre 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="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>

Cas 3 : Afficher les options du menu dans la barre d’action.

<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>

Cas 5 : Menu dans la barre d’action sous forme d’icônes.

<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.

Ajouter les 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).

Etape 1 : Saisir le Nom et Prenom et créer un objet Client.

 File  New  New Activity  Empty Activity (GestionClients).


 Transformer le ConstraintLayout en RelativeLayout.
 Ajouter à l’intérieur de ce Layout un TableLayout (2 lignes, 2 colonnes) :

 Ajouter les Views suivants :


 Deux TextView(s) : textView1 et textView2
 Deux EditText(s) : nom et prenom
 Un Bouton : save

Activity_main.xml (MainActivity)

<?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">

<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>

Créer une classe Client :

Client.java
package ma.tdi2.gestionclients;

/**
* Created by MASK on 27/02/2018.
*/

public final class Client {


private String Nom="";
49 / 167
private String Prenom="";

public String getNom() {


return Nom;
}

public void setNom(String nom) {


Nom = nom;
}

public String getPrenom() {


return Prenom;
}

public void setPrenom(String prenom) {


Prenom = prenom;
}

Créer un nouveau client et affecter des valeurs à ses attributs :

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;

public class MainActivity extends AppCompatActivity {

Client cl = new Client();

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

Button save=(Button) findViewById(R.id.save);

save.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {

EditText nom=(EditText) findViewById(R.id.nom);


EditText prenom=(EditText) findViewById(R.id.prenom);

cl.setNom(nom.getText().toString());
cl.setPrenom(prenom.getText().toString());

}
});
}
}

Etape 2 : Ajouter un group de RadioBoutons pour choisir le sexe.

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.
*/

public final class Client {


private String Nom="";
private String Prenom="";
private String Sexe="";

public String getNom() {


return Nom;
}

public void setNom(String nom) {


Nom = nom;
}

public String getPrenom() {


return Prenom;
}

public void setPrenom(String prenom) {

52 / 167
Prenom = prenom;
}

public String getSexe() {


return Sexe;
}

public void setSexe(String sexe) {


Sexe = sexe;
}

Créer un nouveau client et affecter des valeurs à ses attributs :

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;

public class MainActivity extends AppCompatActivity {

Client cl = new Client();

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

Button save=(Button) findViewById(R.id.save);

save.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {

EditText nom=(EditText) findViewById(R.id.nom);


EditText prenom=(EditText) findViewById(R.id.prenom);

cl.setNom(nom.getText().toString());
cl.setPrenom(prenom.getText().toString());

RadioGroup sexes=(RadioGroup) findViewById(R.id.sexes);

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 !

Voici Activity_main.xml avant l’ajout d’une ListView :

<?xml version="1.0" encoding="utf-8"?>


<android.support.constraint.ConstraintLayout
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">

<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>

Etape 3 : Manipuler une liste de clients.

1 - Manipuler une liste de clients.

List<Client> listClient = new ArrayList<Client>();

Ajouter l’instance Client à la liste listClient :

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;

public class MainActivity extends AppCompatActivity {

List<Client> listClient=new ArrayList<>();

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

Button save=(Button) findViewById(R.id.save);

save.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {

Client cl = new Client();


EditText nom=(EditText) findViewById(R.id.nom);
EditText prenom=(EditText) findViewById(R.id.prenom);
cl.setNom(nom.getText().toString());
cl.setPrenom(prenom.getText().toString());
RadioGroup sexes=(RadioGroup) findViewById(R.id.sexes);
switch (sexes.getCheckedRadioButtonId()) {
case R.id.male:
cl.setSexe("Homme");
break;
case R.id.femelle:
cl.setSexe("Femme");
break;
}
listClient.add(cl);
}
});
}
}

55 / 167
Etape 4 : Ajouter une Liste (ListView).

Le Design :

Activity_main.xml

<?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/background7">

<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>

Nous avons transformé ConstraintLayout en 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;

public class MainActivity extends AppCompatActivity {

List<Client> listClient=new ArrayList<Client>();


ArrayAdapter<Client> adapter=null;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

Button save=(Button) findViewById(R.id.save);


adapter=new
ArrayAdapter<Client>(this,android.R.layout.simple_list_item_1,listClient);

save.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {

Client cl = new Client();


EditText nom=(EditText) findViewById(R.id.nom);
EditText prenom=(EditText) findViewById(R.id.prenom);
cl.setNom(nom.getText().toString());
cl.setPrenom(prenom.getText().toString());
RadioGroup sexes=(RadioGroup) findViewById(R.id.sexes);
switch (sexes.getCheckedRadioButtonId()) {
case R.id.homme:
cl.setSexe("Homme");
break;
case R.id.femme:
cl.setSexe("Femme");
break;
}
listClient.add(cl);

ListView list=(ListView) findViewById(R.id.clients);


list. setAdapter(adapter);
}
});
}
}

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 .

Il suffit de lui passer un tableau ou un ArrayList.

Parmi les constructeurs disponibles, il y a :

public ArrayAdapter (Context context, int textViewResourceId, T[] objects)


public ArrayAdapter (Context context, int textViewResourceId, List<Type> objects)

Paramètres:

 Context : Le contexte courant, généralement l'instance de votre activité.


 textViewResourceId : L'identifiant de la ressource de la vue qui recevra les
données "reformatées"
 objects : Les données sous forme de tableau ou une liste des données.

Exemple d'utilisation :

String[] items = {"élément 1", "élément 2 ", "élément 3"};


new ArrayAdapter<String>(this, android.R.layout.votre_widget, items);

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.

Exercice 1 : Cas ListView.

ListViewClient (Activity)

60 / 167
activity_list_view_client.xml

<?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=".ListView">

<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(String nom, String prenom, Character sexe) {


Nom = nom;
Prenom = prenom;
Sexe = sexe;
}

public Client() {
Nom = "";
Prenom = "";
Sexe = ' ';
}

public String getNom() {


return Nom;
}

public void setNom(String nom) {


Nom = nom;
}

public String getPrenom() {


return Prenom;
}

public void setPrenom(String prenom) {


Prenom = prenom;
}

public Character getSexe() {


return Sexe;
}

public void setSexe(Character sexe) {


Sexe = 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;

public class ListViewClient extends AppCompatActivity {

ArrayList<Client> listClient = new ArrayList<Client>();


ArrayAdapter<Client> adapter=null;
//String[] T = {"Alami Khalid","Wahbi Rachid","Naji Sanae","Talbi Aicha"};
// ArrayAdapter<String> adapter=null;
ListView lv;

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);
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();
}
});
}
}

Dans ce code Java, nous avons utilisé deux sources de données :

 Une collection ArrayList de clients : listClient.


 Un Tabbleau de String contenant des clients : T.

Dans le cas du tableau adapter devient :

adapter = new ArrayAdapter<String>(getApplicationContext(),


android.R.layout.simple_list_item_1,T);

Nous devons tester le code une fois pour ArrayList, et une deuxième fois pour le tableau de
clients.

ListView et ArrayList ListView et Tableau

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)

Les Vues intégrées


64 / 167
Il existe plusieurs vues intégrées (modèles d’affichage) qui peuvent être référencées à l’aide
de : Android. Resource.Layout :

1. simple_list_item_1 : une seule ligne de texte.


2. simple_list_item_2 : deux lignes de texte.
3. simple_list_item_checked : affiche des coches pour indiquer la sélection.
4. simple_list_item_single_choice : affiche un radio bouton à droite de chaque cellule de
ListView pour indiquer une sélection unique. Cependant, on peut avoir une selection
multiple si dans le layout (XML) de ListView on utilise l’attribut :
android:choiceMode = "multipleChoice".
5. simple_list_item_multiple_choice : affiche une case à cocher à droite de chaque
cellule de ListView pour indiquer une sélection à choix multiple. Cependant, on peut
avoir une selection multiple si dans le layout (XML) de ListView on utilise l’attribut :
android:choiceMode="singleChoice".

Exercice 2 : Cas GridView.

DridViewClient (Activity)

activity_grid_view_client.xml

<?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"

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

<?xml version="1.0" encoding="utf-8"?>


<resources>
<color name="colorPrimary">#3F51B5</color>
<color name="colorPrimaryDark">#303F9F</color>
<color name="colorAccent">#FF4081</color>
<color name="yellow">#ffff00</color>
<color name="blue">#00bfff</color>
<color name="gray">#96837a</color>
<color name="green">#58d900</color>
</resources>

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;

public class GridViewClient extends AppCompatActivity {

//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'));

final String T[] = new String[3*listClient.size()];

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);

}
}

GridView et Tableau GridView et ArrayList

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;

public class GridView_ extends AppCompatActivity {

// 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'));

final String T[] = new String[3*listClient.size()];

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

Exercice 3 : Cas Spinner (ComboBox).

69 / 167
SpinnerClient (Activity)

activity_spinner_client.xml

<?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/image3"
tools:context=".Spinner_">

<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;

public class Spinner_ extends AppCompatActivity {


// String[] T = {"Alami Khalid","Wahbi Rachid","Naji Sanae","Talbi Aicha"};
// ArrayAdapter<String> adapter=null;
ArrayList<Client> listClient = new ArrayList<Client>();
ArrayAdapter<Client> adapter=null;
Spinner sp;

@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);

}
}

Spinner et ArrayList Spinner et Tableau

71 / 167
Exercices à faire :

Exercice 4 : Spinner + ListView

Le spinner doit être rempli par : "Homme","Femme","Tout"


ListView affiche une liste filtré.

Exercice 5 : RadioGroup + ListView


72 / 167
Le RadioGroup est contitué de trois RadioButtons : "Homme","Femme","Tout"
ListView affiche une liste filtré.

Exercice 6 : Spinner + ListView


Le spinner doit être rempli par : "Lundi","Mardi" . . . etc.
Les jours selectionnés dans le spinner sont ajoutés dans ListView.
Un bouton Supprimer permet de supprimer du ListView le jour selectionné dans
ListView.
Un bouton Vider ListView permet de vider ListView.

Exercice 0 : Menu pricipal (Basic Activity)

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 :

public class MainActivity extends AppCompatActivity {

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);
}
}

TP8 – ArrayAdapter Personnalisé.


75 / 167
Exercice 1 : Cas ListView.

Méthode :
 Créer ListViewClient (Activity)  Ajouter TextView + ListView.

 Créer monlayout.xml 

 Definir une classe MonAdapter qui hérite ArrayAdapter<Client> et redéfinir


la méthode getView().

 Ecrire le code Java dans ListViewClient.java utilisant une instance de


MonAdapter pour afficher les données dans ListView.

ListViewClient (Activity)

activity_list_view_client.xml

<?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="ma.tdi2.personaliseradapter.PersoListview_Image">
<TextView
android:id="@+id/textView1"
76 / 167
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="ListView Personnalisé"
android:textAlignment="center"
android:textColor="@android:color/holo_green_light"
android:textSize="30sp"
android:textStyle="bold" />

<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>

monlayout.xml (Dossier res/layout. Clic droit  New  Layout ressource file)

<?xml version="1.0" encoding="utf-8"?>


<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal">

<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>

monlayout.xml est un C’est un modèle d’affichage.

MonAdapter.java (Dossier app/java/ma.tdi2.menu_arrayadapter_personalis :


Clic droit  New  Java Class)

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;

public class MonAdapter extends ArrayAdapter<Client> {

public MonAdapter(@NonNull Context context,@LayoutRes int resource) {


super(context, resource);
}

@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

Client cl = getItem( position);


TextView nom = (TextView)v.findViewById(R.id.textView2);
TextView prenom = (TextView)v.findViewById(R.id.textView3);
TextView sexe = (TextView)v.findViewById(R.id.textView1);

nom.setText(cl.getNom());
prenom.setText(cl.getPrenom());
sexe.setText(cl.getSexe().toString());

return v;
}
}

Que fait LayoutInflater ?

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;

public class ListViewClient extends AppCompatActivity {

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);

monadapter = new MonAdapter(getApplicationContext(),0);


lv.setAdapter(monadapter);
monadapter.addAll(listClient);
}
}

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

Exercice 2 : Cas ListView (+images).

monlayout_image.xml

<?xml version="1.0" encoding="utf-8"?>


<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content">

<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)

MonAdapter_image.java (Code Java de ArrayAdapter personnalisé)

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;

public class MonAdapter_image extends ArrayAdapter<Client> {

TextView nom;
TextView prenom;
ImageView icon;

public MonAdapter_image(@NonNull Context context,@LayoutRes int resource) {

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);

Client cl = getItem( position);


TextView nom = (TextView)v.findViewById(R.id.textView1);
TextView prenom = (TextView)v.findViewById(R.id.textView2);
icon = (ImageView) v.findViewById(R.id.icon);

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;

public class ListViewClient_image extends AppCompatActivity {

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);

}
}

ListView et ArrayList (+image)

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;

public class Marque {


private String marque;
private int idMarque;

public Marque(String marque, int idMarque) {


this.marque = marque;
this.idMarque = idMarque;
}
public Marque() {
this.marque = "";
this.idMarque = 0;
}

public String getMarque() {


return marque;
}

public void setMarque(String marque) {


this.marque = marque;
}

public int getIdMarque() {


return idMarque;
}

public void setIdMarque(int idMarque) {


this.idMarque = idMarque;
}
}

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;

public class GridViewClient extends AppCompatActivity {

GridView gv;
ArrayList<Marque> listMarque;
ArrayAdapter monAdapter;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_grid_view_client);

listMarque = new ArrayList<Marque>();


listMarque.add(new Marque("Hundy",R.drawable.logo1));
listMarque.add(new Marque("Audi",R.drawable.logo2));
listMarque.add(new Marque("Toyota",R.drawable.logo3));
listMarque.add(new Marque("Wolgsvagen",R.drawable.logo4));

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)

<?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"
android:layout_width="match_parent"
android:layout_height="match_parent">

<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;

public class MonAdapter_GridView extends ArrayAdapter<Marque> {

public MonAdapter_GridView(@NonNull Context context, int resource) {


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_gridview,null);

Marque mq = getItem( position);


TextView marque=(TextView)v.findViewById(R.id.textView1);
ImageView icon=(ImageView)v.findViewById(R.id.icon);

marque.setText(mq.getMarque());
icon.setImageResource(mq.getIdMarque());
return v;
}
}

GridViewClient AfficherMarque

87 / 167
AfficherMarque (Activity)

Activity_Afficher_Marque (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=".AfficherMarque">

<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;

public class AfficherMarque extends AppCompatActivity {

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 = (ImageView) findViewById(R.id.img);


Intent intent= getIntent();
int idImage = intent.getIntExtra("idImage",0);
String marque = intent.getStringExtra("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

Intent intent = new Intent intent= getIntent();


Intent(getApplicationContext(),Avtivity2.class); String nom = intent.getStringExtra("nom");
int p = intent.getIntExtra("position",0);
intent.putExtra("nom",nom);
intent.putExtra("position",k);

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.

Exercice 2 : Personnalisation d’un GridView.


Réaliser l’écran suivant :

Image1 Fruit1 Image2 Fruit2


Prix1 Prix2
Image3 Fruit3 Image4 Fruit4
Prix3 Prix4
Image5 Fruit5 Image6 Fruit6
Prix5 Prix6

Le résultat sera sous la forme suivante :

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é.

Exercice 3 : Cas Spinner (ComboBox).

MainActivity (Activity)

1. Client.java

package ma.tdi2.app_arrayadapterperso;

public class Client {


private String nom;
private String prenom;
private Character sexe;

public Client(String nom, String prenom, Character sexe) {


this.nom = nom;
this.prenom = prenom;
this.sexe = sexe;
}

public Client() {
this.nom = "";
this.prenom = "";
this.sexe = ' ';
}

public String getNom() {


return nom;
}

public void setNom(String nom) {


this.nom = nom;
}

public String getPrenom() {


return prenom;

91 / 167
}

public void setPrenom(String prenom) {


this.prenom = prenom;
}

public Character getSexe() {


return sexe;
}

public void setSexe(Character sexe) {


this.sexe = sexe;
}

@Override
public String toString() {
return nom + " " + prenom + " " + ((sexe=='H')? "Homme":"Femme");
}
}

2. activity_main.xml

<?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=".MainActivity">

<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

<?xml version="1.0" encoding="utf-8"?>


<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="horizontal"
android:layout_width="match_parent"

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;

public class MonAdapter_image extends ArrayAdapter<Client> {

public MonAdapter_image(@NonNull Context context, int resource) {


super(context, resource);
}

@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);
}

private View createItemView(int position, View convertView, ViewGroup


parent)
{

View v;

LayoutInflater li =
(LayoutInflater)getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
v = li.inflate(R.layout.monlayout_image,null); // null : pas de parent

TextView nom = (TextView) v.findViewById(R.id.textView2);


TextView prenom = (TextView) v.findViewById(R.id.textView3);
ImageView icon = (ImageView) v.findViewById(R.id.icon);

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;

public class MainActivity extends AppCompatActivity {

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);

adapter = new MonAdapter_image(getApplicationContext(),0);

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.

Etape 1 : Ajouter des clients et afficher tous les clients.

MajClient_ListView

activity_maj_client__list_view.xml

<?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/background7"
tools:context=".MajClient_ListView">
<TableLayout
android:id="@+id/infos"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentTop="true">

<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 class Client {

public int id_Cl;


public String Nom;
public Character Sexe;

public Client(int id_Cl, String nom, Character sexe) {


this.id_Cl = id_Cl;
Nom = nom;
Sexe = sexe;
}

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;

public class VenteDatabaseManager extends SQLiteOpenHelper {

// Database and Table Info


private static final String DATABASE_NAME = "Vente";
private static final String TABLE_Client = "Client";

// Client Table Columns


private static final String COL_1 = "id_Cl";
private static final String COL_2 = "Nom";
private static final String COL_3 = "Sexe";

public VenteDatabaseManager(Context context)


super(context, DATABASE_NAME, null, 1);
// Ceci pour créer la BD
SQLiteDatabase db = getWritableDatabase();
}

@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);
}

// Insert a client into the database


public void addClient(Client client) {
// Create and/or open the database for writing
SQLiteDatabase db = getWritableDatabase();

ContentValues values = new ContentValues();


values.put(COL_1, client.id_Cl);
values.put(COL_2, client.Nom);
values.put(COL_3, client.Sexe.toString());

100 / 167
db.insert(TABLE_Client,null, values);
db.close();
}

public List<Client> getAllClients() {


List<Client> listeClient = new ArrayList<Client>();

String CLIENTS_SELECT_QUERY = "SELECT * FROM " + TABLE_Client;

SQLiteDatabase db = getReadableDatabase();
Cursor cursor = db.rawQuery(CLIENTS_SELECT_QUERY, null);

if (cursor.moveToFirst()) {
do {

Client cl = new Client();


cl.id_Cl =
Integer.parseInt(cursor.getString(cursor.getColumnIndex(COL_1)));
cl.Nom = cursor.getString(cursor.getColumnIndex(COL_2));
cl.Sexe = cursor.getString(cursor.getColumnIndex(COL_3)).charAt(0);
listeClient.add(cl);

} 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;

public class MajClient_ListView extends AppCompatActivity {

public VenteDatabaseManager maBD;


public Button save;
public TextView id_Cl,nom;
public RadioGroup sexes;
public ListView lv;
public Client cl;
public ArrayAdapter adapter;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_maj_client__list_view);

maBD = new VenteDatabaseManager(this);

101 / 167
// Afficher dans la ListView
adapter = new
ArrayAdapter<Client>(getApplicationContext(),android.R.layout.simple_list_item_1,ma
BD.getAllClients());
lv.setAdapter(adapter);

id_Cl = (TextView) findViewById(R.id.id_Cl);


nom = (TextView) findViewById(R.id.nom);
sexes = (RadioGroup) findViewById(R.id.sexes);
lv = (ListView) findViewById(R.id.lv);

save = (Button) findViewById(R.id.save);

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;
}

// Enregistrer dans la base


maBD.addClient(cl);

// Afficher dans la ListView


adapter = new ArrayAdapter<Client>(getApplicationContext(),
android.R.layout.simple_list_item_1,maBD.getAllClients());
lv.setAdapter(adapter);

// 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;

public class MajClient_ListView extends AppCompatActivity {

public VenteDatabaseManager maBD;


public Button save,update,delete;
public TextView id_Cl,nom;
public RadioGroup sexes;
public RadioButton homme,femme;
public ListView lv;
public Client cl;
public ArrayAdapter adapter;
104 / 167
public int k;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_maj_client__list_view);

maBD = new VenteDatabaseManager(this);

// Afficher dans la ListView


lv = (ListView) findViewById(R.id.lv);
Afficher();

id_Cl = (TextView) findViewById(R.id.id_Cl);


nom = (TextView) findViewById(R.id.nom);
sexes = (RadioGroup) findViewById(R.id.sexes);

save = (Button) findViewById(R.id.save);

// 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;
}

// Enregistrer dans la base


maBD.addClient(cl);

// Afficher dans la ListView


Afficher();

// Effacer le formulaire et cureur dans EditText id_Cl


Effacer();

}
});

// 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;
}

// Modifier dans la base


maBD.UpdateClient(cl);

// Afficher dans la ListView


Afficher();
}
});

// 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);

// Afficher dans la ListView


Afficher();

// Effacer le formulaire et cureur dans EditText id_Cl


Effacer();
}
});

public void Afficher() {


adapter = new
ArrayAdapter<Client>(getApplicationContext(),android.R.layout.simple_list_item_1,ma
BD.getAllClients());
lv.setAdapter(adapter);
}

public void Effacer() {


id_Cl.setText("");
nom.setText("");
sexes.clearCheck();
id_Cl.requestFocus();
}

106 / 167
VenteDatabaseManager.java

// Update a Client
public void UpdateClient(Client client) {
// Create and/or open the database for writing
SQLiteDatabase db = getWritableDatabase();

ContentValues values = new ContentValues();


values.put(COL_2, client.Nom);
values.put(COL_3, client.Sexe.toString());

// 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();
}

// Empty the table Client


public void EmptyClient()
{
SQLiteDatabase db = getWritableDatabase();
db.execSQL("Delete From " + TABLE_Client);
//db.delete(TABLE_Client, null, null);
db.close();

db.delete(TABLE_Client,"id_Cl=? And Nom=? And Sexe=?",new String[]{Val1, Val2,Val3});

107 / 167
TP10 – Gestion des clients et commandes.

1 - Menu.

1 - Mise à jour de la table Client.

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 class Client {

public int Id_Cl;


public String Nom;
public String Ville;

public Client(int id_Cl, String nom, String ville) {


this.Id_Cl = id_Cl;
Nom = nom;
Ville = ville;
}

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;

public class VenteDatabaseManager extends SQLiteOpenHelper {

// Database and Table Info


private static final String DATABASE_NAME = "Vente";
private static final String TABLE_Client = "Client";
private static final String TABLE_Commande = "Commande";

// Client Table Columns


private static final String COL_1 = "Id_Cl";
private static final String COL_2 = "Nom";
private static final String COL_3 = "Ville";

// Commande Table Columns


private static final String COL_4 = "Id_Com";
private static final String COL_5 = "Date_Com";
private static final String COL_6 = "Id_Cl";

public VenteDatabaseManager(Context context) {


super(context, DATABASE_NAME, null, 1);
// Ceci pour créer la BD
SQLiteDatabase db = getWritableDatabase();

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" +
")";

String CREATE_TABLE_Commande = "CREATE TABLE " + TABLE_Commande +


"(" +
COL_4 + " INTEGER PRIMARY KEY," +
COL_5 + " TEXT," +
COL_6 + " INTEGER REFERENCES " + TABLE_Client +
")";

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);
}

// Insert a client into the database


public void addClient(Client client) {
// Create and/or open the database for writing
SQLiteDatabase db = getWritableDatabase();

ContentValues values = new ContentValues();


values.put(COL_1, client.Id_Cl);
values.put(COL_2, client.Nom);
values.put(COL_3, client.Ville);

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();
}

// Insert an Order into the database


public void addCommande(Commande commande) {
// Create and/or open the database for writing
SQLiteDatabase db = getWritableDatabase();

ContentValues values = new ContentValues();


values.put(COL_4, commande.Id_Com);
values.put(COL_5, commande.Date_Com);
values.put(COL_6, commande.Id_Cl);

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();
}

public List<Client> getAllClients() {


List<Client> listeClient = new ArrayList<Client>();

String CLIENTS_SELECT_QUERY = "SELECT * FROM " + TABLE_Client;

SQLiteDatabase db = getReadableDatabase();
Cursor cursor = db.rawQuery(CLIENTS_SELECT_QUERY, null);

if (cursor.moveToFirst()) {
do {

Client cl = new Client();


cl.Id_Cl =
Integer.parseInt(cursor.getString(cursor.getColumnIndex(COL_1)));
cl.Nom = cursor.getString(cursor.getColumnIndex(COL_2));
cl.Ville = cursor.getString(cursor.getColumnIndex(COL_3));
listeClient.add(cl);

} while(cursor.moveToNext());
}

return listeClient;
}

public List<Commande> getAllCommandes() {


List<Commande> listeCommande = new ArrayList<Commande>();

String COMMANDES_SELECT_QUERY = "SELECT * FROM " + TABLE_Commande;

SQLiteDatabase db = getReadableDatabase();
Cursor cursor2 = db.rawQuery(COMMANDES_SELECT_QUERY, null);

if (cursor2.moveToFirst()) {
do {

Commande com = new Commande();


com.Id_Com =
Integer.parseInt(cursor2.getString(cursor2.getColumnIndex(COL_4)));
com.Date_Com = cursor2.getString(cursor2.getColumnIndex(COL_5));
com.Id_Cl =
Integer.parseInt(cursor2.getString(cursor2.getColumnIndex(COL_6)));;
listeCommande.add(com);

} while(cursor2.moveToNext());
}

return listeCommande;
}

// Update a Client
public void UpdateClient(Client client) {
// Create and/or open the database for writing
SQLiteDatabase db = getWritableDatabase();

ContentValues values = new ContentValues();


values.put(COL_2, client.Nom);
values.put(COL_3, client.Ville);

// 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();
}

// Empty the table Client


public void EmptyClient()
{
SQLiteDatabase db = getWritableDatabase();
db.execSQL("Delete From " + TABLE_Client);
//db.delete(TABLE_Client, null, null);
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;

public class SaisieClient extends AppCompatActivity {

public VenteDatabaseManager maBD;


public Button save,update,delete;
public TextView id_Cl,nom,ville;
public ListView lv;
public Client cl;
public ArrayAdapter adapter;
public int k;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_saisie_client);

maBD = new VenteDatabaseManager(this);

// Afficher dans la ListView


lv = (ListView) findViewById(R.id.lv);
Afficher();

id_Cl = (TextView) findViewById(R.id.id_Cl);


nom = (TextView) findViewById(R.id.nom);
ville = (TextView) findViewById(R.id.ville);

save = (Button) findViewById(R.id.save);

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();

// Enregistrer dans la base


maBD.addClient(cl);

// Afficher dans la ListView


Afficher();

// Effacer le formulaire et cureur dans EditText id_Cl


Effacer();

}
});

} // Fin onCreate

public void Afficher() {


adapter = new
ArrayAdapter<Client>(getApplicationContext(),android.R.layout.simple_list_item_1,ma
BD.getAllClients());
lv.setAdapter(adapter);
}

public void Effacer() {


id_Cl.setText("");
nom.setText("");
ville.setText("");
id_Cl.requestFocus();
}

2 - Mise à jour de la table Commande.

115 / 167
SaisieCommande (Activity) :

activity_saisie_commande.xml

<?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=".SaisieCommande">

<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 class Commande {

public int Id_Com;


public String Date_Com;
public int Id_Cl;

public Commande(int id_Com, String date_Com, int id_Cl) {


Id_Com = id_Com;
Date_Com = date_Com;
Id_Cl = id_Cl;
}

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;

public class SaisieCommande extends AppCompatActivity {

public VenteDatabaseManager maBD;


public Button save;
public TextView id_com,date_com;
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_saisie_commande);

maBD = new VenteDatabaseManager(this);

// Afficher dans la ListView


lv = (ListView) findViewById(R.id.lv);
Afficher();

// Remplissage du Spinner
sp = (Spinner) findViewById(R.id.sp);

list = new ArrayList<String>();


for (int i=0;i < maBD.getAllClients().size();i++)
{
list.add(String.valueOf(maBD.getAllClients().get(i).Id_Cl));
}

adapter = new ArrayAdapter<String>(this,


android.R.layout.simple_spinner_item, list);

adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
sp.setAdapter(adapter);

id_com = (TextView) findViewById(R.id.id_com);


date_com = (TextView) findViewById(R.id.date_com);

save = (Button) findViewById(R.id.save);


// Ajouter un Client

119 / 167
save.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {

com = new Commande();


com.Id_Com = Integer.parseInt(id_com.getText().toString());
com.Date_Com = date_com.getText().toString();
com.Id_Cl = Integer.parseInt(sp.getSelectedItem().toString());

// Enregistrer dans la base


maBD.addCommande(com);

// Afficher dans la ListView


Afficher();

// Effacer le formulaire et cureur dans la zone id_Com


Effacer();

}
});

} // Fin onCreate

public void Afficher() {


adapter = new
ArrayAdapter<Commande>(getApplicationContext(),android.R.layout.simple_list_item_1,
maBD.getAllCommandes());
lv.setAdapter(adapter);
}

public void Effacer() {


id_com.setText("");
date_com.setText("");
id_com.requestFocus();
}
}

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.

Afficher le nombre de commandes en bas de la liste.

Exercice 2 :
Réaliser la consultation des commandes de clients par ville choisie dans un spinner : 

 4 - Consulter les commandes par ville.

Afficher le nombre de commandes en bas de la liste.

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'

Ensuite, ajouter, dans le projet, une classe DataManager.java de la façon suivante :

public class DatabaseManager extends OrmLiteSqliteOpenHelper {

122 / 167
Exercice 1 : Mise à jour d’une table Client.

MainActivity

activity_main.xml

<?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/background7"
tools:context=".MainActivity">

<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;

@DatabaseTable (tableName = "Client")


public class Client {
@DatabaseField (id = true) // (id = true --> Clé primaire, columnName = "id_Cl",
generatedId = true --> pour Identity)
public int id_Cl;
@DatabaseField
public String Nom;
@DatabaseField
public Character Sexe;

// Ce constructeur doit être vide


public Client() {
}

public Client(int id_Cl, String nom, Character sexe) {


this.id_Cl = id_Cl;
Nom = nom;
Sexe = sexe;
}

@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;

public class DatabaseManager extends OrmLiteSqliteOpenHelper {

// Database name
private static final String DATABASE_NAME = "Vente.db";

public DatabaseManager(Context context) {


super(context, DATABASE_NAME, null, 1);
}

@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: ");
}

// Methodes de gestion des clients


public void insertClient(Client client)
{
//DAO signifie Data Access Object et fournit toutes les fonctionnalités
// de la gestion d'une seule classe persistante.
try {
Dao<Client, Integer> dao = getDao(Client.class);
dao.createIfNotExists(client);
} catch (Exception exception)
{

127 / 167
Log.e("DATABASE", "Pb insert: ");
}

public List<Client> getAllClient()


{
try {
Dao<Client, Integer> dao = getDao(Client.class);
// List<Client> Clients = dao.queryForAll();
return dao.queryForAll();
} catch (Exception exception)
{
return null; //new ArrayList<Client>();
}

public void removeClient(Client client) {


try {
Dao<Client, Integer> dao = getDao(Client.class);
dao.delete(client);
} catch (Exception exception)
{
Log.e("DATABASE", "Pb remove: ");
}
}

public void updateClient(Client client) {


try {
Dao<Client, Integer> dao = getDao(Client.class);
dao.update(client);
} catch (Exception exception)
{
Log.e("DATABASE", "Pb insert: ");
}
}

// Methodes de gestion des commandes

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;

public class MainActivity extends AppCompatActivity {

public DatabaseManager maBD;


public Button save,update,delete;
public EditText id_Cl,nom;
public RadioGroup sexes;
public RadioButton homme,femme;
public ListView lv;
public Client cl;
public ArrayAdapter adapter;
public int k;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

maBD = new DatabaseManager(this);

id_Cl = (EditText) findViewById(R.id.id_Cl);


nom = (EditText) findViewById(R.id.nom);
sexes = (RadioGroup) findViewById(R.id.sexes);
lv = (ListView) findViewById(R.id.lv);

// Affichage dans LisTview


Afficher();

save = (Button) findViewById(R.id.save);


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;
}

// Enregistrer dans la base


maBD.insertClient(cl);

// Afficher dans la ListView


Afficher();

// 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);
}

public void Effacer()


{
// Effacer le formulaire
id_Cl.setText("");
nom.setText("");
sexes.clearCheck();
id_Cl.requestFocus();
}

Ajout

Selection

131 / 167
Exercice 2 : Mise à jour de deux tables Client et Commande (OrmLite).

1 - Menu.

2 - Mise à jour de la table Client.

MajClient_ListView

activity_gestion_client.xml

<?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"

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;

@DatabaseTable (tableName = "Client")


public class Client {
@DatabaseField ( id = true, index = true) // ( columnName = "id_Cl", generatedId =
true ) pour Identity
public int id_Cl;
@DatabaseField
public String Nom;
@DatabaseField
public String Ville;

public Client() {
}

public Client(int id_Cl, String nom, String ville) {


this.id_Cl = id_Cl;
Nom = nom;
Ville = ville;
}

@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";

public DatabaseManager(Context context) {


super(context, DATABASE_NAME, null, 1);
}

@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: ");
}

// Methodes de gestion des clients


public void insertClient(Client client)
{
try {
Dao<Client, Integer> dao = getDao(Client.class);
dao.createIfNotExists(client);
} catch (Exception exception)
{
Log.e("DATABASE", "Pb insert: ");
}

public List<Client> getAllClient()


{
try {
Dao<Client, Integer> dao = getDao(Client.class);
// List<Client> Clients = dao.queryForAll();
return dao.queryForAll();
} catch (Exception exception)
{
return null; //new ArrayList<Client>();
}

136 / 167
}

public Client getClient(int id_cl)


{
try {
Dao<Client, Integer> dao = getDao(Client.class);
// List<Client> Clients = dao.queryForAll();
return dao.queryForId(id_cl);
} catch (Exception exception)
{
return null; //new ArrayList<Client>();
}

public Client getClient(String nom)


{
try {
Dao<Client, Integer> dao = getDao(Client.class);
// List<Client> Clients = dao.queryForAll();
return dao.queryForEq("Nom",nom).get(0);
} catch (Exception exception)
{
return null; //new ArrayList<Client>();
}

public void removeClient(Client client) {


try {
Dao<Client, Integer> dao = getDao(Client.class);
dao.delete(client);
} catch (Exception exception)
{
Log.e("DATABASE", "Pb remove: ");
}
}

public void updateClient(Client client) {


try {
Dao<Client, Integer> dao = getDao(Client.class);
dao.update(client);
} catch (Exception exception)
{
Log.e("DATABASE", "Pb insert: ");
}
}

// Methodes de gestion des commandes


// . . .

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;

public class GestionClient extends AppCompatActivity {

public DatabaseManager maBD;


public Button save,update,delete;
public EditText id_Cl,nom,ville;
public ListView lv;
public Client cl;
public ArrayAdapter adapter;
public int k;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_gestion_client);

maBD = new DatabaseManager(this);


id_Cl = (EditText) findViewById(R.id.id_Cl);
nom = (EditText) findViewById(R.id.nom);
ville = (EditText) findViewById(R.id.ville);
lv = (ListView) findViewById(R.id.lv);

// Affichage dans LisTview


Afficher();

save = (Button) findViewById(R.id.save);


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();

// Enregistrer dans la base


maBD.insertClient(cl);

// Afficher dans la ListView


Afficher();

// 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

public void Afficher()


{
// Afficher dans la ListView
adapter = new
ArrayAdapter<Client>(getApplicationContext(),android.R.layout.simple_list_item_1,maBD.getAl
lClient());
lv.setAdapter(adapter);
}

public void Effacer()


{
// Effacer le formulaire
id_Cl.setText("");
nom.setText("");
ville.setText("");
id_Cl.requestFocus();
}
}

139 / 167
3 - Mise à jour de la table Commande.

GestionCommande (Activity) :

activity_gestion_commande.xml

<?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"
140 / 167
android:background="@drawable/image22"
tools:context=".GestionCommande">

<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;

@DatabaseTable (tableName = "Commande")


public class Commande {

@DatabaseField (id = true) // Clé primaire


public int Id_Com;
@DatabaseField
public String Date_Com;
@DatabaseField (canBeNull = false, foreign = true, foreignColumnName = "Id_Cl")
public Client client;

public Commande() {
}

public Commande(int id_Com, String date_Com, Client client) {


Id_Com = id_Com;
Date_Com = date_Com;
this.client = client;
}

@Override
public String toString() {
return Id_Com + " " + Date_Com + " " + client.Nom ;
}

VDatabaseManager.java

La même classe de gestion des clients et commandes à la fois.


Ajouter le code suivant :

. . .

// Methodes de gestion des commandes


public void insertCommande(Commande commande)
{
try {
Dao<Commande, Integer> dao = getDao(Commande.class);
dao.createIfNotExists(commande);
} catch (Exception exception)
{
Log.e("DATABASE", "Pb insert: ");
}

143 / 167
}

public List<Commande> getAllCommande()


{
try {
Dao<Commande, Integer> dao = getDao(Commande.class);
// List<Commande> Commandes = dao.queryForAll();
return dao.queryForAll();
} catch (Exception exception)
{
return null; //new ArrayList<Commande>();
}

public void removeCommande(Commande commande) {


try {
Dao<Commande, Integer> dao = getDao(Commande.class);
dao.delete(commande);
} catch (Exception exception)
{
Log.e("DATABASE", "Pb remove: ");
}
}

public void updateCommande(Commande commande) {


try {
Dao<Commande, Integer> dao = getDao(Commande.class);
dao.update(commande);
} catch (Exception exception)
{
Log.e("DATABASE", "Pb insert: ");
}
}

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;

public class GestionCommande extends AppCompatActivity {

public DatabaseManager maBD;


public Button save,update,delete;
public TextView id_com,date_com;

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);

maBD = new DatabaseManager(this);

// Afficher dans la ListView


lv = (ListView) findViewById(R.id.lv);
Afficher();

// Remplissage du Spinner
sp = (Spinner) findViewById(R.id.sp);

list = new ArrayList<String>();


for (int i=0;i < maBD.getAllClient().size();i++)
{
list.add(String.valueOf(maBD.getAllClient().get(i).Nom));
}

adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item,


list);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
sp.setAdapter(adapter);

id_com = (TextView) findViewById(R.id.id_com);


date_com = (TextView) findViewById(R.id.date_com);

save = (Button) findViewById(R.id.save);


// Ajouter une Commande
save.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {

com = new Commande();


com.Id_Com = Integer.parseInt(id_com.getText().toString());
com.Date_Com = date_com.getText().toString();
com.client = maBD.getClient(sp.getSelectedItem().toString());

// Enregistrer dans la base


maBD.insertCommande(com);

// Afficher dans la ListView


Afficher();

// Effacer le formulaire et cureur dans la zone id_Com


Effacer();

}
});

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

public void Afficher() {


adapter = new
ArrayAdapter<Commande>(getApplicationContext(),android.R.layout.simple_list_item_1,maBD.get
AllCommande());
lv.setAdapter(adapter);
}

public void Effacer() {


id_com.setText("");
date_com.setText("");
id_com.requestFocus();
}
}

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 : 

 4 - Consulter les commandes par ville.

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é.

Voici un exemple de données 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"
}
]
}

Le même exemple en XML :

<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.

Dans notre exemple :


 {"prenom":"Ali","age":30,"mail":"ali@gmail.com"} est un objet Json : JSONObject.

 "employes" : [. . .] est un tableau Json : JSONArray, dont les éléments sont des objets
JSONObject.

 {"employes": [ . . . ]} est un JSONObject (L’objet Json principal) (L’objet racine)

Les types de données Json :


 String  "Bonjour", "Khalid","OK", . . .
 Number  10, 1.5, -30, 1.2 E10, . . .
 Boolean  true et false.
 null  null
 Array  [1,2,3] , ["Fès","Casa","Rabat"] , . . .
 Object  {"key" : "value"} {"nom" : "Tazi"}, {"nom" : "Tazi","age" : 30} , . . .

Voici un deuxième exemple de données JSON :

{
"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"]
}
]
}

Voici un troisième exemple de données JSON :

{
"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"
}
}

Accès aux données dans un fichier Json :

Reprenons le premier exemple :

{
"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"
}
]
}

Mettons ce fichier dans une chaine strData :


String strData = "{\"employes\": [{ ... },{ ... },{ ... }]}";

JSONObject jsonObj = new JSONObject(strData);  transforme strData en données Json.

Et maintenant, on peut accéder aux différentes informations dans ces données :

JSONObject jsonarray = jsonObj.getJSONArray("employes");  récupère le tableau d’objets Json


dans lequel il y’a les trois employés.

Par conséquent, on peut accéder aux différents éléments du tableau par leurs indices :

jsonarray.getJSONObject(0)  récupère le 1er objet du tableau (1 er salarié).


jsonarray.getJSONObject(0).getString("prenom")  récupère le prenom du 1 er salarié.
jsonarray.getJSONObject(0).getInt("age")  récupère l’age du 1er salarié.
jsonarray.getJSONObject(0).getString("mail")  récupère le mail du 1er salarié.

Exercice 1 : Mise en pratique de ces premières notions.

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

<?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=".MainActivity">

<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;

public class MainActivity extends AppCompatActivity {

public TextView textView1,textView2,textView3;


public String strData;
public JSONArray jsonarray;
public JSONObject jsonObj;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

textView1 = (TextView) findViewById(R.id.textView1);


textView2 = (TextView) findViewById(R.id.textView2);
textView3 = (TextView) findViewById(R.id.textView3);

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"));

} catch (JSONException e){


e.printStackTrace();
}

} // 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 .

Methodes d’écriture et de lecture dans un fichier .json :

 Ecriture dans le fichier : (nomfichier = "Client.json" par exemple).

file = new File(getApplication().getFilesDir(),nomFichier);


try {
fileWriter = new FileWriter(file);
bufferedWriter = new BufferedWriter(fileWriter);
bufferedWriter.write(jsobj.toString());
bufferedWriter.close();
} catch (IOException e) {
e.printStackTrace();
}

 Lecture du fichier :

file = new File(getApplication().getFilesDir(),NomfichierJson);


try {
fileReader = new FileReader(file);
bufferedReader = new BufferedReader(fileReader);
stringBuilder = new StringBuilder();
line = bufferedReader.readLine();
while (line != null) {
stringBuilder.append(line).append("\n");
line = bufferedReader.readLine();
}
bufferedReader.close();
} catch (IOException exception) {
exception.printStackTrace();
}
return stringBuilder.toString();

155 / 167
Methodes pour ajouter, modifier et supprimer des objets Json dans un
fichier Json :

Reprenons l’exemple des employés :

{
"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"
}
]
}

strData = "{\"employes\": [ . . . ]} ";


jsonObj = new JSONObject(strData);

Avec:
String strData;
JSONArray jsonarray;
JSONObject jsonObj,jsonObjEmp;

 Ajouter un objet Json (JSONObject) dans un tableau Json (JSONArray) :

jsonObjEmp = new JSONObject();  jsonObjEmp = { }


jsonObjEmp.put("prenom","Youssef");
jsonObjEmp.put("age", 28);
jsonObjEmp.put("mail","youssef@gmail.com");

 jsonObjEmp = {"prenom":"Youssef","age":28, "mail","youssef@gmail.com"}

jsonarray = jsonObj.getJSONArray("employes");
jsonarray.put(jsonObjEmp);

 jsonarray = [{Emp1}, {Emp2}, {Emp3}, {Emp4}]

mainObject = new JSONObject();  mainObject = { }


mainObject.put("clients", jsonarray);

156 / 167
 mainObject = {"clients":[{Emp1}, {Emp2}, {Emp3}, {Emp4}]}

strData = mainObject.toString()

 Modifier une donnée dans tableau Json :

Nous désirons modifier le nom, l’age et l’email du 2ème employé :

jsonObj = new JSONObject(strData);

jsonarray = jsonObj.getJSONArray("employes");

jsonObjEmp = new JSONObject();


jsonObjEmp.put("prenom","Hassan" );
jsonObjEmp.put("age", 34);
jsonObjEmp.put("mail", "hassan@gmail.com ");

jsonarray.put(1,jsonObjEmp); // Ecrase le 2ème employé et prend sa place

mainObject = new JSONObject();


mainObject.put("clients", jsonarray);

strData = mainObject.toString()

 Supprimer une donnée objet Json dans tableau Json :

Nous voulons supprimer le 3ème employé :

jsonarray.remove(2);
mainObject = new JSONObject();
mainObject.put("clients", jsonarray);

strData = mainObject.toString()

Exercice 2 : Mise à jour d’un fichier Client.json :

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)

******** Autre methode

Public List<Client> ReadFileToString( nomfichier)


Public WriteJsonToFile(List list,String nomFichier)

Un peu de cours : Types de données en SQLite.

Datatypes In SQLite Version 3


1. Datatypes In SQLite
Each value stored in an SQLite database (or manipulated by the
database engine) has one of the following storage classes:

 NULL. The value is a NULL value.

 INTEGER. The value is a signed integer, stored in 1, 2, 3, 4, 6, or 8


bytes depending on the magnitude of the value.

 REAL. The value is a floating point value, stored as an 8-byte IEEE


floating point number.

 TEXT. The value is a text string, stored using the database encoding
(UTF-8, UTF-16BE or UTF-16LE).

 BLOB. The value is a blob of data, stored exactly as it was input.

1.1. Boolean Datatype

SQLite does not have a separate Boolean storage class. Instead, Boolean
values are stored as integers 0 (false) and 1 (true).

1.2. Date and Time Datatype

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.

************* Fin du Cours *************

Cours - Compléments

Short Hand If...Else (Ternary Operator)


If you have only one statement to execute, one for if, and one for else, you can put
it all on the same line:

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 »

You can simply write:

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 :

Fonctionnement de l’ArrayAdapter personnalisé

monadapter

DataSource La Vue
listClient ListView
Client1
Objets Client Client2 Cellules

Client3
Client4

167 / 167

Vous aimerez peut-être aussi