Explorer les Livres électroniques
Catégories
Explorer les Livres audio
Catégories
Explorer les Magazines
Catégories
Explorer les Documents
Catégories
fvrier-mars 2016
Abstract
Il sagit des transparents du cours mis sous une forme plus facilement imprimable et lisible.
Ces documents ne sont pas totalement libres de droits. Ce sont des supports de cours
mis votre disposition pour vos tudes sous la licence Creative Commons Attribution - Pas
dUtilisation Commerciale - Partage dans les Mmes Conditions 4.0 International.
1 Environnement de dveloppement 14
1.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
1.1.1 Android . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
1.1.2 Dfinition . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
1.1.3 Composants dAndroid . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
1.1.4 Programmation dapplications . . . . . . . . . . . . . . . . . . . . . . . . . . 16
1.2 SDK Android et Android Studio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
1.2.1 SDK et Studio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
1.2.2 SDK Manager . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
1.2.3 Choix des lments du SDK . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
1.2.4 Dossiers du SDK . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
1.2.5 Android Studio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
1.3 Premire application . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
1.3.1 Objectif de la semaine 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
1.3.2 Assistant de cration dapplication . . . . . . . . . . . . . . . . . . . . . . . . 18
1
IUT de Lannion P. Nerzic
Dept Informatique Programmation Android 2016-17
2
IUT de Lannion P. Nerzic
Dept Informatique Programmation Android 2016-17
3
IUT de Lannion P. Nerzic
Dept Informatique Programmation Android 2016-17
4
IUT de Lannion P. Nerzic
Dept Informatique Programmation Android 2016-17
5
IUT de Lannion P. Nerzic
Dept Informatique Programmation Android 2016-17
4 Application liste 62
4.1 Prsentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
4.1.1 Principe gnral . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
4.1.2 Schma global . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
4.1.3 Une classe pour reprsenter les items . . . . . . . . . . . . . . . . . . . . . . 63
4.1.4 Donnes initiales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
4.1.5 Copie dans un ArrayList . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
4.1.6 Le container Java ArrayList<type> . . . . . . . . . . . . . . . . . . . . . . . 64
4.1.7 Donnes initiales dans les ressources . . . . . . . . . . . . . . . . . . . . . . . 65
4.1.8 Donnes dans les ressources, suite . . . . . . . . . . . . . . . . . . . . . . . . 65
4.1.9 Remarques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
4.2 Affichage de la liste . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
4.2.1 Activit spcialise ou layout . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
4.2.2 Mise en uvre . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66
4.2.3 Layout de lactivit pour afficher une liste . . . . . . . . . . . . . . . . . . . . 66
4.2.4 Mise en place du layout dactivit . . . . . . . . . . . . . . . . . . . . . . . . 66
4.2.5 Layout pour un item . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
4.2.6 Autre layouts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
4.2.7 Layouts prdfinis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
4.3 Adaptateurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68
4.3.1 Relations entre la vue et les donnes . . . . . . . . . . . . . . . . . . . . . . . 68
4.3.2 Rle dun adaptateur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68
4.3.3 Adaptateurs prdfinis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68
4.3.4 ArrayAdapter<Type> pour les listes . . . . . . . . . . . . . . . . . . . . . . . 68
4.3.5 Exemple demploi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69
4.3.6 Affichage avec une ListActivity . . . . . . . . . . . . . . . . . . . . . . . . 69
4.3.7 Exemple avec les layouts standards . . . . . . . . . . . . . . . . . . . . . . . 69
4.4 Adaptateur personnalis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70
4.4.1 Classe Adapter personnalise . . . . . . . . . . . . . . . . . . . . . . . . . . . 70
4.4.2 Classe Adapter perso, suite . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70
4.4.3 Mthode getView personnalise . . . . . . . . . . . . . . . . . . . . . . . . . 71
4.4.4 Mthode PlaneteView.create . . . . . . . . . . . . . . . . . . . . . . . . . . 71
4.4.5 Layout ditem res/layout/item_planete.xml . . . . . . . . . . . . . . . . . 71
4.4.6 Classe personnalise dans les ressources . . . . . . . . . . . . . . . . . . . . . 72
6
IUT de Lannion P. Nerzic
Dept Informatique Programmation Android 2016-17
5 Ergonomie 79
5.1 Barre daction et menus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
5.1.1 Barre daction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
5.1.2 Ralisation dun menu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
5.1.3 Spcification dun menu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80
5.1.4 Icnes pour les menus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80
5.1.5 Thme pour une barre daction . . . . . . . . . . . . . . . . . . . . . . . . . 80
5.1.6 couteurs pour les menus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
5.1.7 Ractions aux slections ditems . . . . . . . . . . . . . . . . . . . . . . . . . 81
5.1.8 Menus en cascade . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
5.1.9 Menus contextuels . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82
5.1.10 Associer un menu contextuel une vue . . . . . . . . . . . . . . . . . . . . . 82
5.1.11 Callback daffichage du menu . . . . . . . . . . . . . . . . . . . . . . . . . . . 83
5.1.12 Callback des items du menu . . . . . . . . . . . . . . . . . . . . . . . . . . . 83
7
IUT de Lannion P. Nerzic
Dept Informatique Programmation Android 2016-17
8
IUT de Lannion P. Nerzic
Dept Informatique Programmation Android 2016-17
5.4.2 Prsentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94
5.4.3 Dfinition des prfrences . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95
5.4.4 Explications . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95
5.4.5 Accs aux prfrences . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96
5.4.6 Prfrences chanes et nombres . . . . . . . . . . . . . . . . . . . . . . . . . . 96
5.4.7 Modification des prfrences par programme . . . . . . . . . . . . . . . . . . 96
5.4.8 Affichage des prfrences . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97
5.4.9 Fragment pour les prfrences . . . . . . . . . . . . . . . . . . . . . . . . . . 97
5.5 Bibliothque support . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97
5.5.1 Compatibilit des applications . . . . . . . . . . . . . . . . . . . . . . . . . . 97
5.5.2 Compatibilit des versions Android . . . . . . . . . . . . . . . . . . . . . . . 98
5.5.3 Bibliothque support . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98
5.5.4 Versions de lAndroid Support Library . . . . . . . . . . . . . . . . . . . . . 98
5.5.5 Mode demploi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99
5.5.6 Programmation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99
5.5.7 Il est temps de faire une pause . . . . . . . . . . . . . . . . . . . . . . . . . . 99
9
IUT de Lannion P. Nerzic
Dept Informatique Programmation Android 2016-17
10
IUT de Lannion P. Nerzic
Dept Informatique Programmation Android 2016-17
11
IUT de Lannion P. Nerzic
Dept Informatique Programmation Android 2016-17
12
IUT de Lannion P. Nerzic
Dept Informatique Programmation Android 2016-17
13
IUT de Lannion P. Nerzic
Dept Informatique Programmation Android 2016-17
Semaine 1
Environnement de dveloppement
1.1. Introduction
1.1.1. Android
n en 2004,
rachet par Google en 2005,
publi en 2007, version 1.5,
de nombreuses versions depuis, on en est la 7.1.1 (janvier 2017).
1.1.2. Dfinition
Systme complet pour smartphones et tablettes
Gestion matrielle : systme dexploitation Linux sous-jacent
API de programmation : interfaces utilisateur, outils. . .
Applications : navigateur, courrier. . .
volution et obsolescence trs rapides (cest voulu)
Ce que vous allez apprendre sera rapidement dpass (1 an)
syntaxiquement (mthodes, paramtres, classes, ressources. . . )
mais pas les concepts (principes, organisation. . . )
Vous tes condamn(e) une autoformation permanente, mais cest le lot des informaticiens.
14
IUT de Lannion P. Nerzic
Dept Informatique Programmation Android 2016-17
15
IUT de Lannion P. Nerzic
Dept Informatique Programmation Android 2016-17
16
IUT de Lannion P. Nerzic
Dept Informatique Programmation Android 2016-17
17
IUT de Lannion P. Nerzic
Dept Informatique Programmation Android 2016-17
18
IUT de Lannion P. Nerzic
Dept Informatique Programmation Android 2016-17
19
IUT de Lannion P. Nerzic
Dept Informatique Programmation Android 2016-17
20
IUT de Lannion P. Nerzic
Dept Informatique Programmation Android 2016-17
21
IUT de Lannion P. Nerzic
Dept Informatique Programmation Android 2016-17
22
IUT de Lannion P. Nerzic
Dept Informatique Programmation Android 2016-17
23
IUT de Lannion P. Nerzic
Dept Informatique Programmation Android 2016-17
Figure 7: lments24
dun projet Android
IUT de Lannion P. Nerzic
Dept Informatique Programmation Android 2016-17
<RelativeLayout
xmlns:android=
"http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/hello_world" />
</RelativeLayout>
25
IUT de Lannion P. Nerzic
Dept Informatique Programmation Android 2016-17
26
IUT de Lannion P. Nerzic
Dept Informatique Programmation Android 2016-17
1.3.15. Gradle
Gradle est un outil de construction de projets comme Make (projets C++ sur Unix), Ant (projets Java
dans Eclipse) et Maven. Il se sert dun (ou plusieurs) script build.gradle qui indique la structure
du projet.
Un projet AndroidStudio est constitu de :
dossier app qui contient src/main qui lui-mme contient java, res et le manifeste
dossier build pour les fichiers intermdiaires (.class et autres)
des fichiers de configuration de gradle :
local.properties : chemin daccs au SDK
build.gradle : structure du projet
27
IUT de Lannion P. Nerzic
Dept Informatique Programmation Android 2016-17
28
IUT de Lannion P. Nerzic
Dept Informatique Programmation Android 2016-17
29
IUT de Lannion P. Nerzic
Dept Informatique Programmation Android 2016-17
30
IUT de Lannion P. Nerzic
Dept Informatique Programmation Android 2016-17
Fonctions Log.* :
Log.i(String tag, String message) affiche une info,
Log.w(String tag, String message) affiche un avertissement,
Log.e(String tag, String message) affiche une erreur.
31
IUT de Lannion P. Nerzic
Dept Informatique Programmation Android 2016-17
Les volumes sont monts dans /mnt, par exemple /mnt/sdcard (mmoire flash interne) et
/mnt/extSdCard (SDcard amovible)
Les applications sont dans :
/system/app pour les pr-installes
/data/app pour les applications normales
Les donnes des applications sont dans /data/data/nom.du.paquetage.java
Ex: /data/data/fr.iutlan.helloworld/. . .
NB : il y a des restrictions daccs sur une vraie tablette, car vous ny tes pas root . . . enfin en
principe.
32
IUT de Lannion P. Nerzic
Dept Informatique Programmation Android 2016-17
1.6.6. Et voil
Cest fini pour cette semaine, rendez-vous la semaine prochaine pour un cours sur les interfaces
Android.
33
IUT de Lannion P. Nerzic
Dept Informatique Programmation Android 2016-17
34
IUT de Lannion P. Nerzic
Dept Informatique Programmation Android 2016-17
Semaine 2
35
IUT de Lannion P. Nerzic
Dept Informatique Programmation Android 2016-17
@Override signifie que onCreate surcharge cette mthode de la superclasse et il faut aussi lappeler
sur super
package fr.iutlan.helloworld;
public final class R {
public static final class id {
public static final int texte=0x7f080000;
}
public static final class layout {
public static final int main=0x7f030000;
}
2.1.4. La classe R
Cette classe R est gnre automatiquement par ce que vous mettez dans le dossier res : dispositions,
identifiants, chanes. . . Certaines de ces ressources sont des fichiers XML, dautres sont des images
PNG.
Par exemple, res/values/strings.xml :
36
IUT de Lannion P. Nerzic
Dept Informatique Programmation Android 2016-17
<menu xmlns:android=
"http://schemas.android.com/apk/res/android">
<item
android:id="@+id/action_settings"
android:orderInCategory="100"
android:showAsAction="never"
android:title="Configuration"/>
</menu>
37
IUT de Lannion P. Nerzic
Dept Informatique Programmation Android 2016-17
<RelativeLayout ...>
<TextView android:text="Demat !" ... />
</RelativeLayout>
qui est rfrenc par son identifiant R.layout.nom_du_fichier (ici cest main) dans le programme
Java :
38
IUT de Lannion P. Nerzic
Dept Informatique Programmation Android 2016-17
Le systme android ira chercher automatiquement le bon texte en fonction des paramtres linguistiques
configurs par lutilisateur.
<RelativeLayout>
<TextView android:text="@string/bonjour" />
</RelativeLayout>
@string/nom est une rfrence une ressource, la chane de res/values/strings.xml ayant ce nom.
NB: remarquez la conversion de type, findViewById retourne une View, superclasse de TextView.
avec la dfinition suivante dans res/layout/main.xml :
<RelativeLayout>
<TextView android:id="@+id/message"
android:text="@string/bonjour" />
</RelativeLayout>
39
IUT de Lannion P. Nerzic
Dept Informatique Programmation Android 2016-17
<ImageView
android:src="@drawable/velo"
android:contentDescription="@string/mon_velo" />
La notation @drawable/nom rfrence limage portant ce nom dans lun des dossiers.
NB: les dossiers res/mipmaps-* contiennent la mme image des dfinitions diffrentes, pour
correspondre diffrents tlphones et tablettes. Ex: mipmap-hdpi contient des icnes en 72x72
pixels.
<resources>
<string-array name="planetes">
<item>Mercure</item>
<item>Venus</item>
<item>Terre</item>
<item>Mars</item>
</string-array>
</resources>
40
IUT de Lannion P. Nerzic
Dept Informatique Programmation Android 2016-17
2.1.16. Autres
Dautres notations existent :
@style/nom pour des dfinitions de res/style
@menu/nom pour des dfinitions de res/menu
Certaines notations, @package:type/nom font rfrence des donnes prdfinies, comme :
@android:style/TextAppearance.Large
@android:color/black
Il y a aussi une notation en ?type/nom pour rfrencer la valeur de lattribut nom, ex :
?android:attr/textColorSecondary.
2.2. Dispositions
2.2.1. Structure dune interface Android
Un cran Android de type formulaire est gnralement compos de plusieurs vues. Entre autres :
TextView, ImageView titre, image
EditText texte saisir
Button, CheckBox bouton cliquer, case cocher
Ces vues sont alignes laide de groupes sous-classes de ViewGroup, ventuellement imbriqus :
LinearLayout positionne ses vues en ligne ou colonne
RelativeLayout positionne ses vues lune par rapport lautre
TableLayout positionne ses vues sous forme dun tableau
41
IUT de Lannion P. Nerzic
Dept Informatique Programmation Android 2016-17
42
IUT de Lannion P. Nerzic
Dept Informatique Programmation Android 2016-17
<Button
android:layout_margin="10dp"
android:layout_marginTop="15dp"
android:padding="10dp"
android:paddingLeft="20dp" />
<LinearLayout android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<Button android:text="Ok" android:layout_weight="1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<Button android:text="Annuler" android:layout_weight="1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout>
43
IUT de Lannion P. Nerzic
Dept Informatique Programmation Android 2016-17
Pour cela, il faut aussi fixer la taille de ces vues (ex : android:layout_width) soit "wrap_content",
soit "0dp". Si la taille vaut "wrap_content", alors le poids agit seulement sur lespace supplmentaire
allou aux vues. Mettre 0dp pour que a agisse sur la taille entire.
<TableLayout ...>
<TableRow>
<item 1.1 .../>
<item 1.2 .../>
</TableRow>
<TableRow>
<item 2.1 .../>
<item 2.2 .../>
</TableRow>
<TableLayout>
44
IUT de Lannion P. Nerzic
Dept Informatique Programmation Android 2016-17
<TableLayout
android:stretchColumns="1,2"
android:shrinkColumns="0,3"
android:layout_width="match_parent"
android:layout_height="wrap_content" >
<TextView android:id="@+id/titre"
android:layout_alignParentTop="true"
android:layout_alignParentRight="true"
android:layout_alignParentLeft="true" .../>
<EditText android:layout_below="@id/titre"
android:layout_alignParentRight="true"
android:layout_alignParentLeft="true" .../>
Et ainsi de suite.
45
IUT de Lannion P. Nerzic
Dept Informatique Programmation Android 2016-17
2.3.2. TextView
Le plus simple, il affiche un texte statique, comme un titre. Son libell est dans lattribut
android:text.
<TextView
android:id="@+id/tvtitre"
android:text="@string/titre"
... />
2.3.3. Button
<Button
android:id="@+id/btn_ok"
android:text="@string/ok"
... />
46
IUT de Lannion P. Nerzic
Dept Informatique Programmation Android 2016-17
2.3.4. Bascules
<CheckBox
android:id="@+id/cbx_abonnement_nl"
android:text="@string/abonnement_newsletter"
... />
Les ToggleButton sont une variante : . On peut dfinir le texte actif et le texte inactif avec
android:textOn et android:textOff.
2.3.5. EditText
<EditText
android:id="@+id/email_address"
android:inputType="textEmailAddress"
... />
Lattribut android:inputType spcifie le type de texte : adresse, tlphone, etc. a dfinit le clavier
qui est propos pour la saisie.
Lire la rfrence Android pour connatre toutes les possibilits.
2.4. Styles
2.4.1. Styles et thmes
Un style permet de modifier lapparence dune vue :
Police de caractres et tailles pour les textes
Couleurs, images. . .
Gomtrie par dfaut des vues : taille, espacement, remplissage. . .
Un thme est un style appliqu toute une activit ou application.
Consulter la documentation Android.
47
IUT de Lannion P. Nerzic
Dept Informatique Programmation Android 2016-17
Lattribut name identifie le style, et parent le rattache un autre pour hritage des proprits non
dfinies ici. Voir les styles et les thmes prdfinis.
<TextView
style="@style/Elegant"
android:text="@string/titre" />
<application
android:theme="@style/Elegant"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
...>
...
</application>
Attention, si votre style nest pas complet, vous aurez une erreur.
48
IUT de Lannion P. Nerzic
Dept Informatique Programmation Android 2016-17
Semaine 3
<application> est la seule branche sous la racine <manifest> et ses filles sont des <activity>.
49
IUT de Lannion P. Nerzic
Dept Informatique Programmation Android 2016-17
Dfinir lattribut android:sharedUserId avec une chane identique une autre application, et signer
les deux applications avec le mme certificat, permet lune daccder lautre.
Un <intent-filter> dclare les conditions de dmarrage dune activit, ici il dit que cest lactivit
principale.
50
IUT de Lannion P. Nerzic
Dept Informatique Programmation Android 2016-17
Linstruction startActivity dmarre Activ2. Celle-ci se met devant Activ1 qui se met alors en
sommeil.
Ce bout de code est employ par exemple lorsquun bouton, un menu, etc. est cliqu. Seule contrainte :
que ces deux activits soient dclares dans AndroidManifest.xml.
String url =
"https://perso.univ-rennes1.fr/pierre.nerzic/Android";
intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
startActivity(intent);
Laction VIEW avec un URI (gnralisation dun URL) est interprte par Android, cela fait ouvrir
automatiquement le navigateur.
51
IUT de Lannion P. Nerzic
Dept Informatique Programmation Android 2016-17
"fr.iutlan.appli2.MainActivity");
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
Cela consiste crer un Intent daction MAIN et de catgorie LAUNCHER pour la classe MainActivity
de lautre application.
3.2. Applications
3.2.1. Fonctionnement dune application
Au dbut, le systme Android lance lactivit qui est marque action=MAIN et catgorie=LAUNCHER
dans AndroidManifest.xml.
Ensuite, dautres activits peuvent tre dmarres. Chacune se met devant les autres comme sur
une pile. Deux cas sont possibles :
La prcdente activit se termine, on ne revient pas dedans.
Par exemple, une activit o on tape son login et son mot de passe lance lactivit principale et
se termine.
La prcdente activit attend la fin de la nouvelle car elle lui demande un rsultat en retour.
Exemple : une activit de type liste ditems lance une activit pour diter un item quand on
clique longuement dessus, mais attend la fin de ldition pour rafrachir la liste.
finish() fait terminer lactivit courante. Lutilisateur ne pourra pas faire back dessus, car elle
disparat de la pile.
52
IUT de Lannion P. Nerzic
Dept Informatique Programmation Android 2016-17
53
IUT de Lannion P. Nerzic
Dept Informatique Programmation Android 2016-17
Ce code identifie lactivit lance, afin de savoir plus tard que cest delle quon revient. Par exemple,
on pourrait lancer au choix plusieurs activits : dition, copie, suppression dinformations. Il faut
pouvoir les distinguer au retour.
Consulter cette page.
@Override
protected void onActivityResult(
int requestCode, int resultCode, Intent data)
{
// uti a fait back
if (resultCode == Activity.RESULT_CANCELED) return;
// selon le code d'appel
switch (requestCode) {
case APPEL_ACTIV2: // on revient de Activ2
...
}
}
setResult(RESULT_OK);
finish();
setResult(RESULT_CANCELED);
finish();
Dans ces deux cas, on revient dans lactivit appelante (sauf si elle-mme avait fait finish().
54
IUT de Lannion P. Nerzic
Dept Informatique Programmation Android 2016-17
Intent intent =
new Intent(this, DeleteInfoActivity.class);
intent.putExtra("idInfo", idInfo);
intent.putExtra("hiddencopy", hiddencopy);
startActivity(intent);
putExtra(nom, valeur) rajoute un couple (nom, valeur) dans lintent. La valeur doit tre srialis-
able : nombres, chanes et structures simples.
Par dfaut, cest un objet neutre ne contenant que des informations Android.
Il est possible de le sous-classer afin de stocker des variables globales de lapplication.
55
IUT de Lannion P. Nerzic
Dept Informatique Programmation Android 2016-17
// initialisation du contexte
@Override
public void onCreate()
{
super.onCreate();
varglob = 3;
}
}
3.3. Activits
3.3.1. Prsentation
Voyons maintenant comment fonctionnent les activits.
Dmarrage ( cause dun Intent)
56
IUT de Lannion P. Nerzic
Dept Informatique Programmation Android 2016-17
57
IUT de Lannion P. Nerzic
Dept Informatique Programmation Android 2016-17
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
@Override signifie que cette mthode remplace celle hrite de la superclasse. Il faut quand mme
lappeler sur super en premier.
// fermer la base
db.close();
}
En fait, il se peut que cette mthode ne soit jamais appele. Voir onStop plutt.
58
IUT de Lannion P. Nerzic
Dept Informatique Programmation Android 2016-17
@Override
public void onSaveInstanceState(Bundle etat) {
// enregistrer l'tat courant
etat.putInt(ETAT_SCORE, mScoreJoueur);
super.onSaveInstanceState(etat);
}
Ces deux mthodes sont appeles automatiquement (sorte dcouteurs), sauf si lutilisateur tue
lapplication. Cela permet de reprendre lactivit l o elle en tait.
Cette mthode cherche la vue qui possde cet identifiant dans le layout de lactivit. Si cette vue
nexiste pas (mauvais identifiant, ou pas cre), la fonction retourne null.
Un mauvais identifiant peut tre la raison dun bug.
59
IUT de Lannion P. Nerzic
Dept Informatique Programmation Android 2016-17
<TextView android:id="@+id/titre"
android:lines="2"
android:text="@string/debut" />
En Java :
Consulter leur documentation pour les proprits, qui sont extrmement nombreuses.
60
IUT de Lannion P. Nerzic
Dept Informatique Programmation Android 2016-17
btn.setOnClickListener(ecouteur);
61
IUT de Lannion P. Nerzic
Dept Informatique Programmation Android 2016-17
62
IUT de Lannion P. Nerzic
Dept Informatique Programmation Android 2016-17
Semaine 4
Application liste
Durant les prochaines semaines, nous allons nous intresser aux applications de gestion dune liste
ditems.
Stockage dune liste
Affichage dune liste, adaptateurs
Consultation et dition dun item
4.1. Prsentation
4.1.1. Principe gnral
On veut programmer une application pour afficher et diter une liste ditems.
Cette semaine, la liste est stocke dans un tableau dynamique appel ArrayList ; en semaine
6, a sera dans une base de donnes SQL locale ou sur un serveur distant.
63
IUT de Lannion P. Nerzic
Dept Informatique Programmation Android 2016-17
Lcran est occup par un ListView. Cest une vue spcialise dans laffichage de listes
quelconques.
Consulter cette documentation sur les ListView.
64
IUT de Lannion P. Nerzic
Dept Informatique Programmation Android 2016-17
void onCreate(...)
{
...
// cration du tableau dynamique
mListe = new ArrayList<Planete>();
// boucle amliore Java7
for (Planete planete: initdata) {
mListe.add(planete);
}
}
import java.util.ArrayList;
ArrayList<TYPE> liste = new ArrayList<TYPE>();
65
IUT de Lannion P. Nerzic
Dept Informatique Programmation Android 2016-17
<resources>
<string-array name="noms">
<item>Mercure</item>
<item>Venus</item>
...
</string-array>
<integer-array name="distances">
<item>58</item>
<item>108</item>
...
</integer-array>
</resources>
4.1.9. Remarques
Cette semaine, les donnes sont reprsentes dans un tableau. Dans les exemples prcdents, cest une
variable membre de lactivit. Pour faire mieux que cela, il faut dfinir une Application comme en
semaine 3 et mettre ce tableau ainsi que son initialisation dedans. Ainsi, le tableau devient disponible
dans toutes les activits de lapplication. Voir le TP4.
En semaine 6, nous verrons comment utiliser une base de donnes SQL locale ou un WebService, ce
qui rsoud proprement le problme.
66
IUT de Lannion P. Nerzic
Dept Informatique Programmation Android 2016-17
<LinearLayout xmlns:android="..."
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ListView android:id="@android:id/list"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
<TextView android:id="@android:id/empty"
android:text="Liste vide"
... />
</LinearLayout>
@Override
protected void onCreate(Bundle savedInstanceState)
{
// appeler la mthode surcharge dans la superclasse
super.onCreate(savedInstanceState);
67
IUT de Lannion P. Nerzic
Dept Informatique Programmation Android 2016-17
// initialisation de la liste
mListe = new ArrayList<Planete>();
...
68
IUT de Lannion P. Nerzic
Dept Informatique Programmation Android 2016-17
4.3. Adaptateurs
4.3.1. Relations entre la vue et les donnes
Un ListView affiche les items laide dun adaptateur (adapter).
69
IUT de Lannion P. Nerzic
Dept Informatique Programmation Android 2016-17
La classe Planete doit avoir une mthode toString(), cf page 63. Cet adaptateur naffiche que le
nom de la plante, rien dautre.
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
70
IUT de Lannion P. Nerzic
Dept Informatique Programmation Android 2016-17
Le style daffichage est minimaliste, seulement la liste des noms. On ne peut pas afficher deux
informations avec un ArrayAdapter.
public
View getView(int position, View recup, ViewGroup parent);
71
IUT de Lannion P. Nerzic
Dept Informatique Programmation Android 2016-17
@Override
public View
getView(int position, View recup, ViewGroup parent)
{
// crer ou rcuprer un PlaneteView
PlaneteView vueItem = (PlaneteView) recup;
if (vueItem == null)
vueItem = PlaneteView.create(parent); // <==(!!)
Figure 26:
72
IUT de Lannion P. Nerzic
Dept Informatique Programmation Android 2016-17
package fr.iutlan.planetes;
public class PlaneteView extends RelativeLayout
{
...
Tout se passe dans la mthode de classe PlaneteView.create appele par ladaptateur. Rappel de
la page 71 :
73
IUT de Lannion P. Nerzic
Dept Informatique Programmation Android 2016-17
LayoutInflater li = LayoutInflater.from(context);
View vueItem = li.inflate(R.layout.item_planete, parent);
On lui fournit lidentifiant du layout, p. ex. celui des items. Elle cre les vues spcifies dans
res/layout/item_planete.xml.
context est lactivit qui affiche toutes ces vues,
parent est la vue qui doit contenir ces vues, null si aucune.
static signifie quon appelle cette mthode sur la classe elle-mme et non pas sur une instance. Cest
une mthode de classe.
74
IUT de Lannion P. Nerzic
Dept Informatique Programmation Android 2016-17
findViewById(R.id.item_planete_distance);
ivImage = (ImageView)
findViewById(R.id.item_planete_image);
}
4.4.13. Rcapitulatif
Voici la squence qui amne laffichage dun item dans la liste :
1. Le ListView appelle la mthode getView(position, ...) de ladaptateur, position est le
no de llment concern,
2. Ladaptateur appelle ventuellement PlaneteView.create :
a. PlaneteView.create fait instancier item.xml = une sous-classe de RelativeLayout
appele PlaneteView.
b. Cela cre les vues nom, distance et image dont PlaneteView.findViews rcupre les
objets Java.
3. Ladaptateur appelle la mthode display du PlaneteView avec les donnes afficher.
a. PlaneteView.display appelle setText des vues pour afficher les valeurs.
4.4.14. Le rsultat
75
IUT de Lannion P. Nerzic
Dept Informatique Programmation Android 2016-17
adapter.notifyDataSetChanged();
@Override
public void onListItemClick (
ListView l, View v, int position, long id)
{
// grer un clic sur l'item identifi par id
...
}
Par exemple, crer un Intent pour afficher ou diter litem. Ne pas oublier dappeler
adapter.notifyDataSetChanged(); au retour.
76
IUT de Lannion P. Nerzic
Dept Informatique Programmation Android 2016-17
@Override
public void onItemClick(
AdapterView<?> parent, View v, int position, long id)
{
// grer un clic sur l'item identifi par id
...
}
Il existe aussi la mthode boolean onItemLongClick ayant les mmes paramtres, installe par
setOnItemLongClickListener.
77
IUT de Lannion P. Nerzic
Dept Informatique Programmation Android 2016-17
@Override
protected void onCreate(Bundle savedInstanceState)
{
...
setListAdapter(
new ArrayAdapter<Planete>(this
android.R.layout.simple_list_item_checked,
android.R.id.text1, mListe));
ListView lv=(ListView)findViewById(android.R.id.list);
lv.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
}
78
IUT de Lannion P. Nerzic
Dept Informatique Programmation Android 2016-17
79
IUT de Lannion P. Nerzic
Dept Informatique Programmation Android 2016-17
Semaine 5
Ergonomie
80
IUT de Lannion P. Nerzic
Dept Informatique Programmation Android 2016-17
des thmes pour afficher soit la barre daction, soit des menus,
deux callbacks pour grer les menus : cration et activation.
Chaque <item> : identifiant, icne et titre, ainsi que lattribut showAsAction valant "always",
"ifRoom" ou "never" selon la visibilit quon souhaite dans la barre daction.
Consulter la page Downloads pour des tlchargements gratuits de toutes sortes de modles et feuilles
de styles.
Tlchargez Action Bar Icon Pack pour amliorer vos applications.
81
IUT de Lannion P. Nerzic
Dept Informatique Programmation Android 2016-17
<resources>
<style name="AppBaseTheme"
parent="android:Theme.Holo.Light" />
</resources>
@Override
public boolean onCreateOptionsMenu(Menu menu)
{
getMenuInflater().inflate(R.menu.nom_du_menu, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.menu_creer:
...
return true;
case R.id.menu_chercher:
...
return true;
...
default: return super.onOptionsItemSelected(item);
}
}
82
IUT de Lannion P. Nerzic
Dept Informatique Programmation Android 2016-17
Ces menus apparaissent lors un clic long sur un lment de liste. Le principe est le mme que pour
les menus normaux :
Attribuer un couteur lvnement onCreateContextMenu. Cet vnement correspond un
clic long et au lieu dappeler la callback du clic long, a fait apparatre le menu.
Dfinir la callback de lcouteur : elle expanse un layout de menu.
Dfinir la callback des items du menu.
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
ListView lv = (ListView)findViewById(android.R.id.list);
registerForContextMenu(lv);
...
83
IUT de Lannion P. Nerzic
Dept Informatique Programmation Android 2016-17
lv.setOnCreateContextMenuListener(this);
Lobjet AdapterContextMenuInfo info permet davoir lidentifiant de ce qui est slectionn, qui a
fait apparatre le menu contextuel.
84
IUT de Lannion P. Nerzic
Dept Informatique Programmation Android 2016-17
5.2.3. Dialogues
Un dialogue est une petite fentre qui apparat au dessus dun cran pour afficher ou demander
quelque chose durgent lutilisateur, par exemple une confirmation.
85
IUT de Lannion P. Nerzic
Dept Informatique Programmation Android 2016-17
<resources>
<string-array name="notes">
<item>Nul</item>
<item>a le fait</item>
<item>Trop cool</item>
</string-array>
</resources>
86
IUT de Lannion P. Nerzic
Dept Informatique Programmation Android 2016-17
Ensuite cela ressemble ce quon fait dans onCreate dune activit : setContentView avec le layout
et des setOnClickListener pour attribuer une action aux boutons.
// crer le dialogue
final Dialog dialog = new Dialog(this);
dialog.setContentView(R.layout.edit_dialog);
dialog.setTitle("Cration d'un type");
// bouton valider
Button btnValider =
(Button) dialog.findViewById(R.id.dialog_btn_valider);
btnValider.setOnClickListener(new OnClickListener() {
@Override public void onClick(View v) {
... // rcuprer et traiter les infos
dialog.dismiss(); // fermer le dialogue
}
});
// afficher le dialogue
dialog.show();
87
IUT de Lannion P. Nerzic
Dept Informatique Programmation Android 2016-17
88
IUT de Lannion P. Nerzic
Dept Informatique Programmation Android 2016-17
@Override
public View onCreateView(LayoutInflater inflater,
ViewGroup container, Bundle savedInstanceState)
{
return inflater.inflate(
R.layout.infos_fragment, container, false);
}
}
5.3.6. ListFragment
Par exemple, voici lattribution dun layout standard pour la liste :
89
IUT de Lannion P. Nerzic
Dept Informatique Programmation Android 2016-17
@Override
public View onCreateView(LayoutInflater inflater,
ViewGroup container, Bundle savedInstanceState)
{
// liste des lments venant de l'application
FragmentApplication app = (FragmentApplication)
getActivity().getApplicationContext();
listeItems = app.getListe();
// layout du fragment
setHasOptionsMenu(true); // le fragment a un menu
return inflater.inflate(android.R.layout.list_content,
container, false);
}
@Override
public void onActivityCreated(Bundle savedInstanceState)
{
super.onActivityCreated(savedInstanceState);
// adaptateur standard pour la liste
ArrayAdapter<Item> adapter = new ArrayAdapter<Item>(
getActivity(), android.R.layout.simple_list_item_1,
listeItems);
setListAdapter(adapter);
// attribuer un couteur pour les clics sur les items
ListView lv = getListView();
lv.setOnItemClickListener(this);
}
90
IUT de Lannion P. Nerzic
Dept Informatique Programmation Android 2016-17
5.3.11. FragmentManager
Pour dfinir des fragments dynamiquement, on fait appel au FragmentManager de lactivit. Il gre
laffichage des fragments. Lajout et la suppression de fragments se fait laide de transactions. Cest
simplement lassociation entre un rceptacle (un FrameLayout vide) et un fragment.
Soit un layout contenant deux FrameLayout vides :
<LinearLayout xmlns:android="..."
android:orientation="horizontal" ... >
<FrameLayout android:id="@+id/frag_liste" ... />
<FrameLayout android:id="@+id/frag_infos" ... />
</LinearLayout>
91
IUT de Lannion P. Nerzic
Dept Informatique Programmation Android 2016-17
// gestionnaire
FragmentManager manager = getFragmentManager();
// transaction
FragmentTransaction trans = manager.beginTransaction();
<LinearLayout xmlns:android="..."
android:orientation="horizontal" ... >
<fragment android:id="@+id/frag_liste" ... />
</LinearLayout>
res/layout-land/main_activity.xml en paysage :
92
IUT de Lannion P. Nerzic
Dept Informatique Programmation Android 2016-17
<LinearLayout xmlns:android="..."
android:orientation="horizontal" ... >
<fragment android:id="@+id/frag_liste" ... />
<fragment android:id="@+id/frag_infos" ... />
</LinearLayout>
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main_activity);
FragmentManager manager = getFragmentManager();
InfosFragment frag_infos = (InfosFragment)
manager.findFragmentById(R.id.frag_infos);
if (frag_infos != null) {
// le fragment des informations est prsent
...
}
93
IUT de Lannion P. Nerzic
Dept Informatique Programmation Android 2016-17
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id)
{
Item item = listeItems.get((int)id);
listener.onItemSelected(item);
}
Elle va chercher litem slectionn et le fournit lcouteur, cest dire lactivit principale.
94
IUT de Lannion P. Nerzic
Dept Informatique Programmation Android 2016-17
public Classe2() {
...
objet1.setOnEvenementListener(this);
}
5.4.2. Prsentation
Il y a deux concepts mis en jeu :
95
IUT de Lannion P. Nerzic
Dept Informatique Programmation Android 2016-17
5.4.4. Explications
Ce fichier xml dfinit la fois :
Les prfrences :
lidentifiant : android:key
le titre rsum : android:title
le sous-titre dtaill : android:summary
la valeur initiale : android:defaultValue
96
IUT de Lannion P. Nerzic
Dept Informatique Programmation Android 2016-17
La mise en page. Cest une sorte de layout contenant des cases cocher, des zones de saisie. . .
Il est possible de crer des pages de prfrences en cascade comme par exemple, les prfrences
systme.
Consulter la doc pour connatre tous les types de prfrences.
NB: le rsum naffiche malheureusement pas la valeur courante. Consulter stackoverflow pour une
proposition.
Les getters ont deux paramtres : lidentifiant de la prfrence et la valeur par dfaut.
Pour les entiers, il y a bug important (fvrier 2015). La mthode getInt plante. Voir stackoverflow
pour une solution. Sinon, il faut passer par une conversion de chane en entier :
97
IUT de Lannion P. Nerzic
Dept Informatique Programmation Android 2016-17
editor.putInt("prefs_nbmax", 20);
// fin de la transaction
editor.commit();
98
IUT de Lannion P. Nerzic
Dept Informatique Programmation Android 2016-17
<uses-sdk android:minSdkVersion="17"
android:targetSdkVersion="25" />
Avec ce manifeste, si la tablette nest pas au moins en API niveau 17, lapplication ne sera pas installe.
Lapplication est garantie pour bien fonctionner jusqu lAPI 25 incluse.
99
IUT de Lannion P. Nerzic
Dept Informatique Programmation Android 2016-17
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:support-compat:25.1.1'
compile 'com.android.support:support-core-utils:+'
}
On rajoute les lments ncessaires. Cest assez compliqu. Il y a la fois le nom : support-compat,
support-core-ui, support-core-utils, support-fragment, appcompat-v7. . . et un numro de
version complet, ou seulement + pour la plus rcente.
5.5.6. Programmation
Enfin, il suffit de faire appel ces classes pour travailler. Elles sont par exemple dans le package
android.support.v4.
import android.support.v4.app.FragmentActivity;
100
IUT de Lannion P. Nerzic
Dept Informatique Programmation Android 2016-17
Semaine 6
Aprs avoir reprsent une liste ditems sous forme dun tableau en semaine 4, nous allons la stocker
dans un SGBD SQL.
SQLite3
Requtes et curseurs
WebServices
6.1. SQLite3
6.1.1. Stockage dinformations
Il nest pas pertinent denregistrer des informations dans un tableau stock en mmoire vive, cest
dire sur un support volatile. Android contient un SGBD SQL appel SQLite3, parfait pour stocker
des informations durables.
Exemple en ligne de commande :
bash$ sqlite3
sqlite> CREATE TABLE Planetes (
_id INTEGER PRIMARY KEY AUTOINCREMENT,
nom TEXT NOT NULL,
distance REAL);
sqlite> INSERT INTO Planetes VALUES (1, "Sedna", 12925.26);
sqlite> SELECT * FROM Planetes;
1|Sedna|12925.26
sqlite>
6.1.2. SQLite3
SQLite3 est un vrai SGBD relationnel SQL, mais simplifi pour tenir sur une tablette.
Ce qui lui manque :
101
IUT de Lannion P. Nerzic
Dept Informatique Programmation Android 2016-17
Jointures, groupements, requtes imbriques, transactions, index, triggers. . . tout cela est possible.
Consulter la documentation.
Cette commande est dans le dossier du SDK, sous-dossier platform-tools (Linux et Windows). Elle
nest pas forcment incluse dans le systme Linux de la tablette.
102
IUT de Lannion P. Nerzic
Dept Informatique Programmation Android 2016-17
Vous pourrez changer ce fichier avec le PC (adb push ou pull). Consulter cette page pour des
dtails sur la marche suivre.
Dans une application Android, ces fichiers sont manipuls laide de classes de lAPI.
NB: ce cours commence par une grande simplification (louverture dune BDD). Lisez la totalit pour
savoir comment on procde en ralit.
103
IUT de Lannion P. Nerzic
Dept Informatique Programmation Android 2016-17
void onCreate(...) {
...
bdd = SQLiteDatabase.openOrCreateDatabase(...);
}
void onDestroy() {
...
bdd.close();
}
}
104
IUT de Lannion P. Nerzic
Dept Informatique Programmation Android 2016-17
...
}
On va aussi rajouter des mthodes de consultation des donnes mais avant, voyons la mthode
execSQL.
105
IUT de Lannion P. Nerzic
Dept Informatique Programmation Android 2016-17
void execSQL (String sql, Object[] bindArgs) : cest pour le mme type de requte mais
contenant des jokers ? affecter avec les objets fournis en paramtre.
106
IUT de Lannion P. Nerzic
Dept Informatique Programmation Android 2016-17
107
IUT de Lannion P. Nerzic
Dept Informatique Programmation Android 2016-17
Le finally garantit la fermeture du curseur, mme en cas dexception et de return dans le try.
Attention, votre application doit prendre soin de fermer ce curseur ds quil ne sert plus, ou alors de
le fournir un objet (ex: un adaptateur) qui sait le fermer automatiquement.
108
IUT de Lannion P. Nerzic
Dept Informatique Programmation Android 2016-17
mais je ne vois pas lintrt de recoder en Java ce qui se fait parfaitement en SQL, sans compter les
risques derreur si on permute involontairement les paramtres de ces mthodes.
NB: cela ne cre pas les tables, seulement le fichier qui contient la base.
Il faut fournir le chemin daccs la base. Mais en faisant ainsi, la base est cre dans
/data/data/*package*/files et non pas .../databases. Voir page 108 pour la vritable faon de
faire.
bdd.execSQL(
"CREATE TABLE IF NOT EXISTS Planetes (" +
"_id INTEGER PRIMARY KEY AUTOINCREMENT," +
"nom TEXT NOT NULL)");
Un autre problme, cest la mise jour de lapplication. Quallez-vous proposer vos clients si vous
changez le schma de la base entre la V1 et la V2, la V2 et la V3. . . ?
109
IUT de Lannion P. Nerzic
Dept Informatique Programmation Android 2016-17
onUpgrade(bdd, int oldV, int newV) : cette mthode est appele quand la version de
lapplication est suprieure celle de la base. Son rle peut tre de faire des ALTER TABLE...,
UPDATE....
Les mthodes getReadableDatabase et getWritableDatabase de SQLiteOpenHelper ouvrent la
base et appellent automatiquement onCreate et onUpgrade si ncessaire.
...
@Override
public void onCreate(SQLiteDatabase bdd)
{
// cration avec la mthode de la classe TablePlanetes
TablePlanetes.create(bdd);
}
@Override
public void onUpgrade(SQLiteDatabase bdd,
int oldVersion, int newVersion)
{
// suppression de toutes les donnes !
TablePlanetes.drop(bdd);
// re-cration de la base
onCreate(bdd);
}
}
110
IUT de Lannion P. Nerzic
Dept Informatique Programmation Android 2016-17
Dans le cas dune application srieuse, on ne dtruit pas toutes les donnes utilisateur quand on change
le schma. Cest vous de dterminer les modifications minimales qui permettent de transformer les
donnes prsentes, de leur version actuelle oldVersion la version newVersion.
Il est indiqu de procder par tapes :
passer de la version oldVersion la oldVersion+1
passer de la version oldVersion+1 la oldVersion+2
ainsi de suite, jusqu arriver la newVersion.
@Override
public void onUpgrade(..., int oldVersion, int newVersion){
while (oldVersion < newVersion) {
switch (oldVersion) {
case 1: // amener la base de la V1 la V2
bdd.execSQL("ALTER TABLE Planetes ADD COLUMN taille REAL");
break;
case 2: // amener la base de la V2 la V3
...
break;
}
oldVersion++;
}
}
A la terminaison de lapplication, cest le helper quil faut fermer, et cest lui qui ferme la base :
111
IUT de Lannion P. Nerzic
Dept Informatique Programmation Android 2016-17
helper.close();
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
112
IUT de Lannion P. Nerzic
Dept Informatique Programmation Android 2016-17
setContentView(R.layout.main);
...
Cette dernire instruction exige de dfinir trois callbacks dans lactivit : onCreateLoader,
onLoadFinished et onLoaderReset. Voyons dabord la premire.
@Override
public Loader<Cursor> onCreateLoader(int loaderID,
Bundle bundle)
{
return new MonCursorLoader(getApplicationContext(), bdd);
}
113
IUT de Lannion P. Nerzic
Dept Informatique Programmation Android 2016-17
Cette callback fait instancier un MonCursorLoader qui est une sous-classe de CursorLoader, dfinie
dans notre application, voir le transparent suivant. Son rle est de lancer la requte qui retourne le
curseur contenant les donnes afficher.
Voir page 107 pour la mthode getAll, elle fait seulement return bdd.rawQuery("SELECT * FROM
Planetes", null);
@Override
public void onLoadFinished(Loader<Cursor> loader,
Cursor cursor) {
adapter.changeCursor(cursor);
}
@Override
public void onLoaderReset(Loader<Cursor> loader) {
adapter.changeCursor(null);
}
114
IUT de Lannion P. Nerzic
Dept Informatique Programmation Android 2016-17
6.4. ContentProviders
6.4.1. Prsentation rapide
Les Fournisseurs de contenu sont des sortes de tables de donnes disponibles dune application
lautre et accessibles laide dun URI (gnralisation dun URL). Un exemple est le carnet dadresse
de votre tlphone. Dautres applications que la tlphonie peuvent y avoir accs.
Un ContentProvider possde diffrentes mthodes ressemblant celles des bases de donnes :
query : retourne un Cursor comme le fait un SELECT,
insert, update, delete : modifient les donnes,
Dautres mthodes permettent de consulter le type MIME des donnes.
Comme cest trs compliqu mettre en uvre et que a ressemble une simple table SQL sans
jointure, on nen parlera pas plus ici.
6.5. WebServices
6.5.1. Base de donne distante
Remarque : cette partie de cours concerne les bases de donnes mais sera prsente en semaine 7,
avec les AsyncTask et requtes HTTP.
On arrive au plus intressant, faire en sorte quune application Android stocke ses donnes sur un
serveur distant. Pour commencer, rvisez vos cours de Web Design, PHP, PDO. . .
115
IUT de Lannion P. Nerzic
Dept Informatique Programmation Android 2016-17
// prparation et excution
$query = $db->prepare(
"UPDATE Planetes SET nom=? WHERE _id=?");
$query->execute(array($nom, $id));
116
IUT de Lannion P. Nerzic
Dept Informatique Programmation Android 2016-17
117
IUT de Lannion P. Nerzic
Dept Informatique Programmation Android 2016-17
118
IUT de Lannion P. Nerzic
Dept Informatique Programmation Android 2016-17
119
IUT de Lannion P. Nerzic
Dept Informatique Programmation Android 2016-17
Semaine 7
Cette semaine est consacre lAPI de cartographie OpenStreetMap mais auparavant quelques
concepts importants connatre : les tches asynchrones et les requtes rseau.
7.1. AsyncTasks
7.1.1. Prsentation
Une activit Android repose sur une classe, ex MainActivity qui possde diffrentes mthodes comme
onCreate, les couteurs des vues, des menus et des chargeurs.
Ces fonctions sont excutes par un seul processus lger, un thread appel Main thread . Il dort la
plupart du temps, et ce sont les vnements qui le rveillent.
Ce thread ne doit jamais travailler plus de quelques fractions de secondes sinon linterface parat
bloque et Android peut mme dcider que lapplication est morte (App Not Responding).
120
IUT de Lannion P. Nerzic
Dept Informatique Programmation Android 2016-17
121
IUT de Lannion P. Nerzic
Dept Informatique Programmation Android 2016-17
a veut dire quon peut appeler la mme mthode de toutes ces manires, le nombre de paramtres
est variable :
doInBackground();
doInBackground("www.meteo.fr");
doInBackground("www.meteo.fr", "www.weather.fr","www.bericht.fr");
122
IUT de Lannion P. Nerzic
Dept Informatique Programmation Android 2016-17
ProgressBar mProgressBar =
(ProgressBar) findViewById(R.id.pourcent);
new PrevisionPluie(mProgressBar)
.execute("www.meteo.fr","www.weather.fr","www.bericht.fr");
execute va crer un thread spar pour effectuer doInBackground, mais les autres mthodes du
AsyncTask restent dans le thread principal.
float pluie =
new PrevisionPluie(mProgressBar).execute("www.meteo.fr");
123
IUT de Lannion P. Nerzic
Dept Informatique Programmation Android 2016-17
7.1.14. Simplification
On peut simplifier un peu sil ny a pas besoin de ProgressBar et si le rsultat est directement utilis
dans onPostExecute :
124
IUT de Lannion P. Nerzic
Dept Informatique Programmation Android 2016-17
}
protected void onPostExecute(Float pluie) {
// utiliser pluie, ex: l'afficher dans un TextView
...
}
}
7.1.15. Recommandations
Il faut faire extrmement attention :
ne pas bloquer le thread principal dans une callback plus de quelques fractions de secondes,
ne pas manipuler une vue ailleurs que dans le thread principal.
Ce dernier point est trs difficile respecter dans certains cas. Si on cre un thread, il ne doit jamais
accder aux vues de linterface. Un thread na donc aucun moyen direct dinteragir avec lutilisateur.
Si vous tentez quand mme, lexception qui se produit est :
Only the original thread that created a view hierarchy can touch its views
Les solutions dpassent largement le cadre de ce cours et passent par exemple par la mthode
Activity.runOnUiThread
Le handler gre le lancement immdiat (post) ou retard (postDelayed) de la tche. Elle peut
elle-mme se relancer.
125
IUT de Lannion P. Nerzic
Dept Informatique Programmation Android 2016-17
un client HTTP Apache DefaultHttpClient bien pratique, mais il est obsolte depuis lAPI
22,
une classe appele HttpURLConnection maintenant recommande,
une API appele Volley un peu trop complexe pour ce cours.
Vous savez que le protocole HTTP a plusieurs mthodes , dont GET, POST, PUT et DELETE qui sont
employes pour grer un WebService. On va voir les deux premires.
126
IUT de Lannion P. Nerzic
Dept Informatique Programmation Android 2016-17
String params =
"?libelle=" + URLEncoder.encode(libelle, "UTF-8") +
"&auteur=" + URLEncoder.encode(auteur, "UTF-8");
Voir le TP7 pour une implantation plus polyvalente (boucle sur un ContentValues).
127
IUT de Lannion P. Nerzic
Dept Informatique Programmation Android 2016-17
<uses-permission android:name="android.permission.INTERNET"/>
7.3. OpenStreetMap
7.3.1. Prsentation
Au contraire de Google Maps, OSM est vraiment libre et OpenSource, et il se programme extrmement
facilement.
7.3.2. Documentation
Nous allons utiliser deux librairies :
OSMdroid : cest la librarie de base, super mal documente. Attention ne pas confondre avec
un site de piraterie.
OSMbonusPack, un ajout remarquable cette base. Son auteur sappelle Mathieu Kergall. Il
a ajout de trs nombreuses fonctionalits permettant entre autres dutiliser OpenStreetMap
pour grer des itinraires comme les GPS de voiture et aussi afficher des fichiers KML venant
de Google Earth.
Lire cette suite de tutoriels pour dcouvrir les possibilits de osmbonuspack.
128
IUT de Lannion P. Nerzic
Dept Informatique Programmation Android 2016-17
@Override
protected void onCreate(Bundle savedInstanceState)
{
// mise en place de l'interface
super.onCreate(savedInstanceState);
setContentView(R.layout.main_activity);
Un GeoPoint est un couple (latitude, longitude) reprsentant un point sur Terre. Il y a aussi laltitude
si on veut. Cest quivalent un LatLng de GoogleMaps.
130
IUT de Lannion P. Nerzic
Dept Informatique Programmation Android 2016-17
7.3.7. Calques
Les ajouts sur la carte sont faits sur des overlays. Ce sont comme des calques. Pour ajouter quelque
chose, il faut crer un Overlay, lui rajouter des lments et insrer cet overlay sur la carte.
Il existe diffrents types doverlays, p. ex. :
ScaleBarOverlay : rajoute une chelle
ItemizedIconOverlay : rajoute des marqueurs
RoadOverlay, Polyline : rajoute des lignes
Par exemple, pour rajouter un indicateur dchelle de la carte :
// redessiner la carte
mMap.invalidate();
a marche sans cela dans la plupart des cas, mais y penser sil y a un problme.
7.3.9. Marqueurs
Un marqueur est reprsent par un Marker :
131
IUT de Lannion P. Nerzic
Dept Informatique Programmation Android 2016-17
mrkIUT.setOnMarkerClickListener(new OnMarkerClickListener() {
@Override
public boolean onMarkerClick(Marker marker, MapView map)
{
Toast.makeText(MainActivity.this,
marker.getSnippet(),
Toast.LENGTH_LONG).show();
return false;
}
});
7.3.12. Itinraires
Il est trs facile de dessiner un itinraire sur OSM. On donne le GeoPoint de dpart et celui darrive
dans une liste, ventuellement des tapes intermdiaires :
132
IUT de Lannion P. Nerzic
Dept Informatique Programmation Android 2016-17
LocationManager locationManager =
(LocationManager) getSystemService(LOCATION_SERVICE);
Location position =
locationManager.getLastKnownLocation(
LocationManager.GPS_PROVIDER);
if (position != null) {
mapController.setCenter(new GeoPoint(position));
}
NB: a ne marche quen plein air (rception GPS). Consulter aussi cette page propos de lutilisation
du GPS et des rseaux.
locationManager.requestLocationUpdates(
LocationManager.GPS_PROVIDER, 0, 0, this);
133
IUT de Lannion P. Nerzic
Dept Informatique Programmation Android 2016-17
mMap.getOverlays().add(new LongPressMapOverlay(this));
7.3.18. Autorisations
Pour finir, Il faut autoriser plusieurs choses dans le Manifeste : accs au GPS et au rseau, et criture
sur la carte mmoire :
<uses-permission
android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission
android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission
android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission
android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission
android:name="android.permission.INTERNET" />
<uses-permission
android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
134
IUT de Lannion P. Nerzic
Dept Informatique Programmation Android 2016-17
135
IUT de Lannion P. Nerzic
Dept Informatique Programmation Android 2016-17
Semaine 8
Dessin 2D interactif
Le cours de cette semaine concerne le dessin de figures 2D et les interactions avec lutilisateur.
CustomView et Canevas
Un exemple de bote de dialogue utile
8.1. Dessin en 2D
8.1.1. Principes
Une application de dessin 2D dfinit une sous-classe de View et surcharge sa mthode onDraw, cest
elle qui est appele pour dessiner la vue. Voici le squelette minimal :
package fr.iutlan.dessin;
public class DessinView extends View {
Paint mPeinture;
public DessinView(Context context, AttributeSet attrs) {
super(context, attrs);
mPeinture = new Paint();
136
IUT de Lannion P. Nerzic
Dept Informatique Programmation Android 2016-17
mPeinture.setColor(Color.BLUE);
}
public void onDraw(Canvas canvas) {
canvas.drawCircle(100, 100, 50, mPeinture);
}
}
Il faut mettre le package et le nom de la classe en tant que balise XML. Ne pas oublier les attributs
de taille.
Bitmap bm =
Bitmap.createBitmap(100, 100, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bm);
Cest dj fait pour le canvas fourni la mthode onDraw. On obtient le bitmap de la vue avec
getDrawingCache().
137
IUT de Lannion P. Nerzic
Dept Informatique Programmation Android 2016-17
Il est prfrable de crer les peintures dans le constructeur de la vue ou une autre mthode, mais
surtout pas dans la mthode onDraw.
8.1.7. Motifs
Il est possible de crer une peinture base sur un motif. On part dune image motif.png dans le
dossier res/drawable quon emploie comme ceci :
Bitmap bmMotif = BitmapFactory.decodeResource(
context.getResources(), R.drawable.motif);
BitmapShader shaderMotif = new BitmapShader(bmMotif,
Shader.TileMode.REPEAT, Shader.TileMode.REPEAT);
mPaintMotif = new Paint(Paint.ANTI_ALIAS_FLAG);
mPaintMotif.setShader(shaderMotif);
mPaintMotif.setStyle(Paint.Style.FILL_AND_STROKE);
Cette peinture fait appel un Shader. Cest une classe permettant dappliquer des effets progressifs,
tels quun dgrad ou un motif comme ici (BitmapShader).
138
IUT de Lannion P. Nerzic
Dept Informatique Programmation Android 2016-17
8.1.8. Shaders
Voici la ralisation dun dgrad horizontal bas sur 3 couleurs :
8.1.11. Dessinables
Les canvas servent dessiner des figures gomtriques, rectangles, lignes, etc, mais aussi des Drawable,
cest dire des choses dessinables telles que des images bitmap ou des formes quelconques. Il
existe beaucoup de sous-classes de Drawable.
Un Drawable est cr :
139
IUT de Lannion P. Nerzic
Dept Informatique Programmation Android 2016-17
Bitmap bm = BitmapFactory
.decodeResource(getResources(), R.drawable.image);
Drawable d = new BitmapDrawable(getResources(),bm);
Android a dfini une norme pour des images PNG tirables, les 9patch .
Une image 9patch est borde sur ses 4 cts par des lignes noires qui spcifient les zones tirables
en haut et gauche, et les zones qui peuvent tre occupes par du texte droite et en bas.
Il faut utiliser loutil draw9patch pour les diter. a demande un peu de savoir-faire.
140
IUT de Lannion P. Nerzic
Dept Informatique Programmation Android 2016-17
8.1.14. Variantes
Android permet de crer des dessinables variantes par exemple pour des boutons personnaliss.
<item android:drawable="@drawable/button_pressed"
android:state_pressed="true" />
<item android:drawable="@drawable/button_checked"
android:state_checked="true" />
<item android:drawable="@drawable/button_default" />
</selector>
Lune ou lautre des images sera choisie en fonction de ltat du bouton, enfonc, relch, inactif.
141
IUT de Lannion P. Nerzic
Dept Informatique Programmation Android 2016-17
@Override
public boolean onTouchEvent(MotionEvent event) {
float x = event.getX();
float y = event.getY();
switch (event.getAction()) {
case MotionEvent.ACTION_MOVE:
...
break;
}
return true;
}
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
figure = Figure.creer(typefigure, color);
figure.setReference(x, y);
figures.add(figure);
break;
case MotionEvent.ACTION_MOVE:
142
IUT de Lannion P. Nerzic
Dept Informatique Programmation Android 2016-17
143
IUT de Lannion P. Nerzic
Dept Informatique Programmation Android 2016-17
8.3.3. Concepts
Plusieurs concepts interviennent dans ce slecteur de couleur :
La fentre drive de DialogFragment, elle affiche un dialogue de type AlertDialog avec des
boutons Ok et Annuler,
Cet AlertDialog contient une vue personnalise contenant des SeekBar pour rgler les com-
posantes de couleur,
Les SeekBar du layout ont des callbacks qui mettent jour la couleur choisie en temps rel,
Le bouton Valider du AlertDialog dclenche un couteur dans lactivit qui a appel le slecteur.
144
IUT de Lannion P. Nerzic
Dept Informatique Programmation Android 2016-17
Elle change seulement la composante rouge de la variable mColor. Il y a les mmes choses pour le
vert, le bleu et la transparence.
145
IUT de Lannion P. Nerzic
Dept Informatique Programmation Android 2016-17
new ColorPickerDialog(
new ColorPickerDialog.OnColorChangedListener() {
@Override
public void colorChanged(int color) {
// utiliser la couleur ....
}
}
).show(getFragmentManager(), "fragment_colorpicker");
Cela consiste dfinir un couteur qui reoit la nouvelle couleur du slecteur. Lcouteur peut la
transmettre la classe qui dessine une nouvelle figure.
146
IUT de Lannion P. Nerzic
Dept Informatique Programmation Android 2016-17
147