Professional Documents
Culture Documents
Exercice 1:
Number? -O ---------
INCREMENT
incrementer();
});
c. En mode Design ;
Commentaires:
Si une application se met en arriere-plan (si on appuie sur la touche Home pour revenir au
0 bureau), on risque de perdre les valeurs des elements graphiques du cette applicat ion
{Android peut decharger la memoire pour gagner des ressources). Par exemple, lorsque on
rebascule sur une application {appui long sur la touche Home), !'application peut avoir perdu
les val eurs saisies dans les zones de t exte.
• Android permet a travers l'objet Bundle (passe en parametre de la fonction
Oncreate()) de restaurer les valeurs des interfaces d'une activite.
• a
Pour forcer Android sauvegarder/restaurer les valeurs des elements graphiques, on
doit implementer les fonctions onSavelnstanceState et onRestorelnstanceState.
• Pour forcer Android a decharger les valeurs des elements graphiques, on configure
notre appareil comme suit : Development tools > Development Settings, cocher
Immediately destroy activities.
• L'objet Bundle ne peut pas sauvegarder/restaurer les zones de textes qui ne possedent
pas un identifiant.
• L'objet Bundle ne peut pas restaurer une application completement detruite.
Ens. Walid SAAD Mat. Programmation Mobile Sec. Gen ie lnfo rmat ique
Exercice 2:
L'IMC est un nombre qui se calcule a partir de la taille et de la masse corporelle d'un
individu. L'int erface graphique pour calculer l'IMC ressemble a la figure suivant e :
0
My Appljcation
Poids:
Talll
CALCULER L:IMC
EFFACER
Resuhal:
ous devez cllquer sur lebouton • Caleolerr lMC • pour
obtenir un resultat
• La formule pour calculer l'IMC est: poids (en kilogrammes)/ taille (en metres) 2.
• Le bouton EFFACER remet a zero taus les champs {sans oublier le texte pour le
resultat).
• Les elements dans le RadioGroup permettent a l ' utili sat eur de preciser en quelle
unite ii a indique sa taille. Pour obtenir la taille en metres depuis la taille en
centimetres ii suffit de diviser par 100.
• Des qu'on change les valeurs dans les champs Poids et Taille, on remet le texte du
resultat par defaut puisque la valeur calculee n'est plus valable pour les nouvelles
valeurs.
Ens. Walid SAAD Mat. Programmation Mobile Sec. Gen ie lnfo rmat ique
• On enverra un message d'erreur si l'utilisateur essaie de faire le calcul avec une taille
egale a zero grace a un Toast.
Remarques
Ens. Walid SAAD Mat. Programmation Mobile Sec. Gen ie lnfo rmat ique
Exercice 3 (ListView simple avec ArrayAdapter par defaut)
0 Eludlanl 1
Eludlant 2
EIud 1anI 3
Etudlant 4
Etudlant 5
Etud1ant 6
Etudlant 7
La fonction OnCreate() :
protected void onCreate(Bundle savedinstanceS tate)
super.o nCreate(savedi nstanceState) ;
setContentView(R.layout.activity_main);
String[] etudiants = new String[]{
"Etudiant 1" , "Etudiant 2" , "Etudiant 3" , "Etudiant
4" , "Etudiant 5" , "Etudiant 6" ,
"Etudiant 7"I ;
list= (ListView) findViewByid(R.id.mylist);
ArrayAdap ter<String> tablea u = new
ArrayAdapter<String>(list.getContext(),
android.R.layout.simple list item_l, etudiants);
list .setAdapter(tableau);
La fonction OnCreate() :
protected void onCreate(Bundle savedinstanceState)
super.onCreate(savedinstanceState);
setconte ntview(R.layout.activity_main);
list = (ListView)findViewByid(R . id.mylist);
ArrayAdapter<String> tableau= new
ArrayAdapter<String>( list.getContext(),
android.R.layout.simple list item 1);
for ( i n t i = l ; i<=50; i++) {
tableau.add("Etudiant " + i); }
list.setAdapter(tableau);
Ens. Walid SAAD Mat. Programmation Mobile Sec. Gen ie lnfo rmat ique
3. On veut maintenant ajouter un avatar pour chaque etudiant. Ce qui donne dans la
preview !'int erf ace ci -dessous. Pour cela, II faut creer un nouveau gabarit (layout)
etudiantinfo.xml contenant une lmageView et un Text View . Ce layout representera
une ligne de la ListeView.
11 22
"
0 TP1-3 ...,.
0-Ji'I
B E1udian 1
B Et1Khan 2
B Etudrant 3
l] E1ud1ant 4
a ElUd1am 5
B Etud1ant6
B E1ud1an 7
l] Etud1ant 8
B Etud1ant 9
+-=:,
B E1ud1ant 10
a
La fonction OnCreate():
protected void oncreate(Bundle savedinstanceState)
super.onCreate(savedinstanceState);
setContentView(R.layout. activity_main);
ListView list = (ListView)findViewByid(R.id.mylist);
ArrayAdapter<String> tableau = new
ArrayAdapter<String>(lis t.getcontext(),
R.layout. etudiantinfo,R.id.no m);
for (int i=l; i<=50; i++) {
tableau.add("Etudiant " + i); }
list.setAdapter(tableau);
<ImageView
android:src="@drawable/contact"
android:layout_width="59dp"
android:layout height="40dp"
android:id="@+id/imageView" />
<TextView
android:text="TextView"
Ens. Walid SAAD Mat. Programmation Mobile Sec. Gen ie lnfo rmat ique
android:layout_width="167dp"
android :layout _height ="wrap_content"
android:id="@+id/nom" />
</LinearLayout>
Commentaires:
0 Dans cet exemple List View, ii faut utiliser le constructeur de ArrayA dapter suivant:
ArrayAdap er (Context context, i nt resource, int textViewResourceld)
Ou ressource est l'id du layout a a
appliquer chaque ligne et t extView Resourceld est l'id de la
zone de texte inclue dans ce layout . A chaque entree de la List View, la vue generee ut ilisera le
layout etudiantin fo.xml et la zone de texte cont iendra la chaine de caracteres passee en
a
argument la methode add.
4. On veut maint enant afficher l'etudiant selectionne de la ListView dans un message
Toast. Pour cela, ii faut ajouter l' evenement OnltemClicklistener a la classe
MainActivity, imp lementer !' inte rface AdapterView.OnltemClicklistener et redefi nir la
methode onltemClick{).
Ens. Walid SAAD Mat. Programmation Mobile Sec. Gen ie lnfo rmat ique
public void onitemClick(AdapterView<?> parent, View view, int
position, long id) {
String element= (String)parent.getitemAtPosition(position);
Toast .makeText(this ,element, T oast.LENGTH_LONG) . s how();
Ens. Walid SAAD Mat. Programmation Mobile Sec. Gen ie lnfo rmat ique
Exercice 4 (ListView complexe avec ArrayAdapter personnalise)
Dans cet exercice nous allons creer une ListView complexe avec plusieurs donnees afin de
gerer les absences des etudiants dans une matiere donnee. Comme le montre la preview ci-
dessous, nous allons ajouter l'adresse email, l'option et le nombre d'absence.
Lorsque chaque item de la liste contient plusieurs donnees dynamiques, ii taut recoder la
classe ArrayAdapter.
G
Etudlant 1
nom pr nom a;gm 11 com
1
ID
Eludlant 2
nom.prenom@gma1I com
2
SRS
udl n 3
nom pr noml@gmatl com
0
SRS
E udl n 4
nom prenom a;gma I com
4
GUD
Etapes d'implementation:
1. Creer un nouveau gabarit etudiantinfo2.xml representant chaque item de la ListeView.
Ens. Walid SAAD Mat. Programmation Mobile Sec. Gen ie lnfo rmat ique
2. Definir le model de donnees : nous allons creer une classe contenant les donnees d'un
Etudiant.
public class Etudiant {
private String option;
private String nom;
private String email;
private int abs;
@Override
//convertView est notre vue recyclee
public View getView(int position, View convertView , ViewGroup
parent) {
; ·Android nous fournit un convert View null lorsqu'il nous demande
de la creer dans le cas concraire, cela veut dire qu'il nous
fournit une vue recyclee*/
if(convertView == null) {
/* on recupere notre gabarit etudiantinfo2 via un
Layoutinflater, qui va charger un layout xml dans un objet View*/
convertView =
Layoutinflater.from(getco ntext()).inflate(R.layout. e tudiantinfo2,pa
rent, false );
)
//comme nos vues sont reutilisees, notre convertview
possede deja un ViewHolder
EtudiantViewHolder viewHolder = ( EtudiantViewHolder)
convertView.getTag();
if(viewHolder == null ) {
//si elle n'avait pas encore de ViewHolder
viewHo lder = new EtudiantViewHolder(;)
//recuperer nos sous vues
viewHolder.nom = ( TextView)
convertView.findViewByid(R . id.nom);
viewHolder.email = (TextView)
convertView.findViewByid(R .i d.email);
viewHolder.option = (TextView)
convertView.findViewByid(R.id.option);
Ens. Walid SAAD Mat. Programmation Mobile Sec. Gen ie lnfo rmat ique
viewHolder .abs = (TextView)
convertView.findViewByid (R.id.nbabs);
viewHolder.avatar = (ImageView)
convertview.findViewByid(R .id.avatar);
1lpuis on sauvegarde le mini-controlleur dans la vue
convertView.setTag(viewHolder);
Commentaires:
Afin d'eviter d'appeler les methodes findViewByld a chaque reutilisation des vues, Android a
rajoute un concept, nomme ViewHolder (gardien/protecteur de vue), qui va avoir le role de
a
mini controlleur, associe chaque cellule, et qui va stocker les references vers nos sous vues
(dans notre cas : nom, email, option, abs et avat ar) .
Ce contr61eur va ensuite etre stocke en tant que propriete de la vue {plus precisement dans
l'attribut tag) afin de pouvoir garder toujours le meme principe de recyclage, une vue n'a
qu' un seul ViewHolder, et inversement.
Ens. Walid SAAD Mat. Programmation Mobile Sec. Gen ie lnfo rmat ique
protected void onCreate(Bundle savedinstanceS tate)
Etapes d'implementation:
l. Creer un nouveau gabarit etudiantinfo2.xml representant chaque item de la List eView.
2. Definir le model de donnees : nous allons creer une classe contenant les donnees d'un
Etudiant.
public class Etudiant {
private String option;
private string nom ;
private String email;
private int abs;
this.option = option;
this.nom = nom;
this.email = email;
this.abs = abs;
Ens. Walid SAAD Mat. Programmation Mobile Sec. Gen ie lnfo rmat ique
II creer notre vue a partir du fichier layout
@Override
public EtudiantHolder onCreateViewHolder(ViewGroup parent, int
viewType) {
View view= inflater. inflate(R .layout .etudiantinfo2,
paren t, false);
EtudiantHolder holder= new EtudiantHolder(view);
return holder;
0 II Bind data
@Override
public void onBindViewHolder(Etud iantHo lder holder, int position)
Commentaires:
Le code de !'Adapter est plus complexe: ii s'agit d'une classe util isa nt un generique
a
{V iewHolder) qui doit creer un objet encapsulant l'objet graphique afficher pour chaque
item {dans notre cas EtudiantHolder heritant de RecyclerView.ViewHolder). L'Adapter a
deux buts:
• Creer les objets graphiques : onCreateViewHolder(ViewGroup parent, int viewType)
• Changer le contenu d'un objet graphique stocke dans EtudiantHolder en fonction de
la position de la liste: onBlndVlewHolder(StringHolder holder, Int position).
Ens. Walid SAAD Mat. Programmation Mobile Sec. Gen ie lnfo rmat ique
setCo ntentView(R.layout .activity_main);
I I Setup and Handover data to recyclervietv
myrcv = (RecyclerView) findViewByid(R.id.rcv ) ;
List<Etudiant> data = genererEtudiants();
myAdapter = new EtudiantAdap ter(MainActivity.this, data);
myrcv .setLayoutManager(new
LinearLayoutManager(MainActivity.this));
myrcv.setAdapte r( myAdapter);
0
b. Ajouter les donnees des etudiants au RecyclerView.
Ens. Walid SAAD Mat. Programmation Mobile Sec. Gen ie lnfo rmat ique
Exercice 6 (Menu ActionBar)
Dans cet exercice on souha it e ajouter un ActionBar a !'applicat ion reali see dans l'exerc ice 6
cornme le montre la preview ci-dessous. L' Act ionBar permettra de gerer la list e des etudiants.
0 Ajouter
Chercher
Etudl;;
nom. Editer
GLID
Supprimer
Etudlan\ 2
nom.prenom@gmall.com
2
SRS
Etudlan1 3
nom .prenom@gmall .com
0
SRS
Etudiant 4
nom.prenom@gmall.com
4
GLID
Etudlant S
nom.prenom@gmall.com
Etapes d'implementation:
1. Creer le fichier layout suivant my_menu.xml dans res/menu/, representant notre
ActionBar a implementer.
<?xm.l version= "l.0" encoding="utf-8"?>
<menu xmlns:app="http://schemas.androi.d com/ apk/res-auto"
xm.lns: an droid="http://sch emas.androi d.com/apk/res/android>"
<item android:title="Ajouter"
android:icon="@android:draw able/ic_input_add"
android :showAsAction="ifRoom"
android:id="@+id/add" />
<item
android:id="@+id/search"
Ens. Walid SAAD Mat. Programmation Mobile Sec. Gen ie lnfo rmat ique
android :id= "@+id/edit" />
<item android :title= "Supprimer"
android :icon= "@android:draw able/ic_delete"
android:id="@+id/delete" />
</menu >
Component Tree
IQ menu
'§ d (Ajoute r)
;- search (Cherc:herJ
[1?.l edit (Editer)
= d e le t e (Suppr imer)
J Design I Tat
2. Modifier la classe MainActivity comme suit :
a. La classe MainActivity doit heriter de AppCompatActivity :
public class MainActivity extends AppCompatActivity {}
b. Implementer les methodes onCreateOptionsMenu et onOptionsltemSelected
de la man iere suivante :
public boolean onCreateOp tionsMenu(Menu menu) {
II Inflate the menu; this adds items to the action bar if it
is present.
getMenuinflater().inflate(R .menu .mymenu, menu);
return super .onCreateOptionsMenu(men u);
@Override
public boolean onOptionsitemSelected(Menuitem item) {
int id = item.getitemid();
if (id== R .id.search) {
Toas t.makeText ( getApplicationCon text(), "Rechercher un
etudiant", Toast.LENGTB_LONG) . show();
if (id R.id.ad d )
Ens. Walid SAAD Mat. Programmation Mobile Sec. Gen ie lnfo rmat ique
To as t . ma k e Te x t ( g e t A pp l i c a t i o n Co n t e x t () , "Aj o u t e r un
e t udi a n t " , T o a s t .L EN GT H_ L ONG ) . show ( ) ;
if ( i d == R . i d . de l e t e ) {
To a s t . ma k e Text ( g e t Ap p l i c a t i o n c o n t e x t () , "supprimer un
e t udi ant " , T o a s t . LEN GT H_ L ON G ) . show () ;
if ( i d == R . i d . e d i t ) {
To as t . ma k e Te x t (g e t Ap p l i c a t i o n Co n t e x t () , "Mo d i f i e r un
0 e t udi a n t " , T o a s t .L ENGT H_ LONG ) . show ( ) ;
return s up er . o no p t i o ns i t e mSe l e c t e d ( i t e m ) ;
Commentaires :
• a
L'a tt ribut app:showAsAction="ifRoom" associe une act ion permet de demander
d'ajouter cette action comme un bouton dans la barre d'act ion , si la place est
disponible.
• La methode onCreateOptionsMenu(Menu menu) permet de cont roler Le menu de
l'action bar. Cette methode charge un fichier menu depuis les ressources
{res/menu/).
• La methode onOptionsltemSelected(Menultem item) permet de filtrer les clicks de
l'ut ilisat eur su r un des boutons de l'act ion bar.
Ens. Walid SAAD Mat. Programmation Mobile Sec. Gen ie lnfo rmat ique
Exercice 7 (CardView)
Ou vous demande dans cet exercice de modifier l'exercice 6 en utilisant une cardView qui
representera chaque etudiant. L'ensemble des CardView sera affiche dans un RecyclerView .
II faut commencer par modifier le gabarit etudiantinfo2.xml par l'ajout d'une ardView qui va
0 contenir toutes les informations relatives a un etudiant (avatar, nom, email, option et
nombre d'absence).
Ens. Walid SAAD Mat. Programmation Mobile Sec. Gen ie lnfo rmat ique