Vous êtes sur la page 1sur 55

Tutoriel Android sous Android Studio

Dima Rodriguez

To cite this version:



Dima Rodriguez. Tutoriel Android sous Android Studio. Ecole dingenieur. France. 2015.
<cel-01241650v2>

HAL Id: cel-01241650


https://hal.archives-ouvertes.fr/cel-01241650v2
Submitted on 6 Feb 2017

HAL is a multi-disciplinary open access Larchive ouverte pluridisciplinaire HAL, est


archive for the deposit and dissemination of sci- destinee au depot et `a la diffusion de documents
entific research documents, whether they are pub- scientifiques de niveau recherche, publies ou non,
lished or not. The documents may come from emanant des etablissements denseignement et de
teaching and research institutions in France or recherche francais ou etrangers, des laboratoires
abroad, or from public or private research centers. publics ou prives.
Tutoriel Android TM

TP de prise en main

Dima Rodriguez
Polytech Paris Sud

Tutoriel AndroidT M

Dima Rodriguez

Dcembre 2015

TP de prise en main
Table des matires
Prambule 4

1 Installation de lIDE 5

2 Configuration de lIDE 6
Installation des paquets supplmentaires et des mises jours . . . . . . 6

3 Notre premire application Android 8


Cration dun projet et dune application Hello World . . . . . . . . . 8
Excution de lapplication . . . . . . . . . . . . . . . . . . . . . . . . . 9
Se reprer dans le projet . . . . . . . . . . . . . . . . . . . . . . . . . 13
Modification de linterface utilisateur . . . . . . . . . . . . . . . . . . . 15
Rpondre aux vnements . . . . . . . . . . . . . . . . . . . . . . . . . 21
Crer et lancer une autre activit . . . . . . . . . . . . . . . . . . . . . 22
Crer des animations . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
Crer un View personnalis pour grer un jeu . . . . . . . . . . . . . . 33
Temporisation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
Rajouter un bouton sur la barre daction . . . . . . . . . . . . . . . . . 41
Lancement dune autre application . . . . . . . . . . . . . . . . . . . . 42
Changement de langue . . . . . . . . . . . . . . . . . . . . . . . . . . 43
Conclusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44

Annexes 47
La classe R . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
Explication du code gnr par dfaut pour la classe Principale . . . . . 48
Cycle de vie dune activit . . . . . . . . . . . . . . . . . . . . . . . . 51

2
Table des figures
2.1 SDK Manager . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7

3.1 Cration dun projet . . . . . . . . . . . . . . . . . . . . . . . . . 9


3.2 Cration dune activit . . . . . . . . . . . . . . . . . . . . . . . 10
3.3 cration dun AVD . . . . . . . . . . . . . . . . . . . . . . . . . . 11
3.4 Excution de lapplication . . . . . . . . . . . . . . . . . . . . . . 12
3.5 Aperu de linterface Android Studio . . . . . . . . . . . . . . 13
3.6 Hirarchie de LinearLayout . . . . . . . . . . . . . . . . . . . . . 17
3.7 Premier test de lapplication modifie . . . . . . . . . . . . . . . . 20
3.8 Champ de saisie et bouton . . . . . . . . . . . . . . . . . . . . . 20
3.9 Cration dune nouvelle activit . . . . . . . . . . . . . . . . . . . 22
3.10 Cration dune ressource animation . . . . . . . . . . . . . . . . . 28
3.11 Animation en LinearLayout . . . . . . . . . . . . . . . . . . . . . 30
3.12 Modification du layout . . . . . . . . . . . . . . . . . . . . . . . 31
3.13 Animation en RelativeLayout . . . . . . . . . . . . . . . . . . . . 31
3.14 Ajout dun bouton pour lancer le jeu . . . . . . . . . . . . . . . . 37
3.15 Activit avec vue personnalise . . . . . . . . . . . . . . . . . . . 39
3.16 Menu de la barre daction . . . . . . . . . . . . . . . . . . . . . . 41

3.1 Cycle de vie dune activit . . . . . . . . . . . . . . . . . . . . . 52

3
Prambule
Le systme dexploitation Android est actuellement lOS le plus utilis dans le
monde faisant tourner des smartphones, tablettes, montres connectes, liseuses
lectroniques, tlvisions interactives, et bien dautres. Cest un systme, open
source qui utilise le noyau Linux. Il a t cre par Android, Inc. qui fut rachete
par Google en 2005. Le dveloppement dapplications pour Android seffectue
en Java en utilisant des bibliothques spcifiques.
Le but de ce tutoriel est de vous familiariser avec lesprit de dveloppement An-
droid et ses bibliothques. Nous introduirons les concepts de bases de cration
dapplication en mettant en uvre quelques fonctionnalits simples. Ce tutoriel
nest en aucun cas exhaustif, le potentiel des applications Android est beau-
coup plus ample, les exemples cits dans ce document ne devront pas brider votre
imagination ni votre curiosit.
Sur le site officiel pour les dveloppeurs Android vous trouverez la documen-
tation des classes, des tutoriels ainsi que les lignes directrices pour prparer une
distribution Google Play. Un lexique la fin de ce document dfinit quelques
mot du vocabulaire Android utilis dans ce tutoriel.

4
1 Installation de lIDE
Dans cette section nous allons dcrire la procdure dinstallation dun environne-
ment de dveloppement Android.
Attention : Il faut excuter les tapes dans lordre cit ci-dessous.
a. Tlchargez le dernier JDK (Java Development Kit) que vous pouvez trou-
ver sur le site dOracle 1 .
b. Dsinstallez des ventuelles versions antrieures du JDK
c. Installez le nouveau JDK
d. Tlchargez Android Studio. Il contient lenvironnement de dvelop-
pement, le SDK (Software Development Kit) Android avec la dernire
version de la plateforme, ainsi quun mulateur.
e. Lancez lexcutable pour dmarrer linstallation et suivez le wizard 2

1. Ce tutoriel a t ralis avec JDK8u65


2. Si le rpertoire Java nest pas dtect automatiquement, il faudrait dfinir une variable
denvironnement JAVA_HOME qui indique le rpertoire o vous avez install le JDK (ex :
C :\Program Files\Java\jdk1.7.0_21)

5
2 Configuration de lIDE

Installation des paquets supplmentaires et des


mises jours
a. Lancez Android Studio
b. Nous commencerons par nous assurer que nous possdons tout ce quil
faut pour dvelopper. Dans la page de dmarrage, slectionnez Configure
> SDK Manager. Dans le gestionnaire (fig.2.1) vous verrez la version du
SDK install (avec les mises jour disponibles) et aussi la version de lAPI
(Application Programming Interface) installe et la version du OS pour
laquelle elle vous permettra de dvelopper. Installez les ventuelles mises
jour. Assurez vous de cocher au moins un System Image pour lmulateur. 1
c. Dans longlet SDK Tools assurez vous davoir au moins
. Android SDK Build Tools
. Android SDK Tools
. Android SDK Platform Tools
. Android Support Library
. Android Support Repository
. Google Repository
. Google Play Services
d. Quand vous aurez termin, cliquez Apply pour lancez les installations des
lments supplmentaires.

1. Les images systmes Intel ncessitent linstallation dun acclrateur Intel (HAXM) que
trouverez sur le site Intel. Une fois loutil install il faut activer lacclration dans votre BIOS
(activer Vt-x ). Si vous ne souhaitez pas installer un tel outil, prenez une image avec un processeur
ARM.

6
Tutoriel Android 7

Figure 2.1 SDK Manager


Dans cet exemple, il existe une mise jour disponible pour lAPI 23 qui permet un
dveloppement pour Android 6.0

Polytech Paris Sud Dima Rodriguez


3 Notre premire application
Android

Cration dun projet et dune application Hello


World
a. Dans le menu Quick Start, slectionnez Start a new Android Studio Project
, et renseignez les informations comme dans la figure 3.1a
b. Cliquez sur Next puis remplissez les champs comme dans la figure 3.1b

Application name : cest le nom qui va apparaitre dans la liste des appli-
cations sur lappareil et dans le Play Store.
Company domain : cest un qualifiant qui apparaitra dans le nom du pa-
ckage .
Package name : il est utilis comme identifiant de lapplication, il permet
de considrer diffrentes versions dune application comme tant une
mme application. Il doit tre unique parmi tous les packages installs
sur le systme.
Minimum required SDK : cest la version Android la plus ancienne sur
laquelle lapplication peut tourner. Il faut viter de remonter trop en
arrire, a rduirait les fonctionnalits que vous pourriez donner votre
application. 1

c. Cliquez sur Next. Nous arrivons la cration dune activit (un cran avec
une interface graphique). Slectionnez Blank Activity (fig. 3.2a) et cliquez
Next.
1. Il est possible dactiver certaines fonctionnalits (non essentielles) de votre application
uniquement quand elle tourne sur une version qui les supporte. Pour plus dinformations consulter
cette page

8
Tutoriel Android 9

(a) Configuration du projet (b) Choix des cibles

Figure 3.1 Cration dun projet

d. Renseignez les champs comme dans la figure 3.2b. Vous pourriez choisir
lutilisation de fragments, mais pour faire simple nous poursuivrons sans
fragments. Chaque activit dispose dun layout qui dfinit la faon dont
les composants seront disposs sur lcran. Une activit peut tre divise
en portions (ou fragments) chacune ayant son propre layout. La notion
de fragment a t introduite pour favoriser la r-utilisabilit de morceaux
dactivit (un fragment peut tre dfinit une fois et rutilis dans plusieurs
activits).
e. Cliquez sur Finish, le projet est cre.

Excution de lapplication
Sur un mulateur
Un mulateur permet de reproduire le comportement dun appareil rel dune faon
virtuelle. Lutilisation dun mulateur nous vite davoir charger chaque fois

Polytech Paris Sud Dima Rodriguez


Tutoriel Android 10

(a) Ajout dune activit (b) Personnalisation de lactivit

Figure 3.2 Cration dune activit

Polytech Paris Sud Dima Rodriguez


Tutoriel Android 11

(a) Choix de lappareil (b) Choix du processeur

Figure 3.3 cration dun AVD

lapplication dans un appareil pour la tester. On pourra ainsi lancer lapplication


dans lIDE et elle sexcutera sur un appareil virtuel appel Android Virtual Device
AVD qui mule le comportement dun tlphone, une tablette ou autre.
Pour configurer un mulateur, allez dans Tools > Android > AVD Manager, un
mulateur existe par dfaut, mais vous pourriez rajouter dautres appareils en cli-
quant sur Create Virtual Device . Dans lexemple de la figure 3.3a nous rajoutons
une tablette Nexus 10 avec une extra haute rsolution (xhdpi). Nous slectionnons
ensuite le processeur qui sera mul (fig.3.3b). En cochant Show downloadable
system images vous pouvez tlcharger dautres images systmes avec dautres
versions Android. En cliquant sur Next Vous avez ensuite la possibilit de confi-
gurer dautres paramtres.
Notez qu la cration de lappareil sa rsolution vous est signale. Ceci est impor-
tant noter pour lintgration dimages dans lapplication.
Pour lancer lexcution sur lmulateur, appuyez sur le bouton dexcution (fig.3.4)
et slectionnez lmulateur sur lequel vous souhaitez lancer lapplication. Vous pou-
vez cochez Use same device for future launches pour viter davoir slectionner
lappareil chaque lancement. Lmulateur se lance, a peut prendre quelques mi-
nutes soyez patients. Rassurez-vous, vous naurez pas le relancer chaque fois
que vous compilez votre projet, laissez-le ouvert et chaque fois que vous compilez
et relancez votre application, elle pourra tre charge dans lmulateur en cours (il
vous le proposera parmi les Running devices ).

Polytech Paris Sud Dima Rodriguez


Tutoriel Android 12

Figure 3.4 Excution de lapplication

Sur un appareil rel


Connectez votre appareil par cble USB lordinateur et installez le pilote si
ncessaire 2 .
Activez loption de dbogage USB sur lappareil en allant dans les paramtres, sous
dveloppement ou options pour les dveloppeurs. Pour les versions suprieures
4.2, cette option est cache par dfaut, pour la faire apparaitre, allez dans
Paramtres>A propos .. et touchez Numro de build sept fois. Retournez ensuite
lcran Paramtres , vous verrez apparaitre Options pour les dveloppeurs, rentrez
y et activez le dbogage.
Lancez lapplication depuis Android Studio comme prcdemment. Si on vous
demande de choisir lappareil, slectionnez Choose a running device, puis votre
tlphone ou tablette. Android Studio installera lapplication sur votre appareil
et la lancera.
Si au moment de la slection de lappareil vous recevez un message indiquant
que lappareil nest pas compatible, assurez vous dabord que la version Sdk de
lappareil est bien suprieure au minSdk version de votre projet. Si cest le cas,
allez sur votre appareil tout en tant connect par USB dsactivez puis ractivez
loption de dbogage USB , il vous demandera de confirmer lidentifiant de votre

2. Si vous travaillez sur MAC OS, il ny a rein de plus faire. Si vous tes sous Windows
reportez vous https://developer.android.com/studio/run/oem-usb.html pour les
tapes dinstallation Si Vous travaillez sous Linux reportez vous https://developer.
android.com/studio/run/device.html.

Polytech Paris Sud Dima Rodriguez


Tutoriel Android 13

Compilation Excution et Debug

Navigateur des fichiers ouverts

Palette des composants graphiques


Liste des composants
de l'activit
Aperu de

composant selectionn
l'activit

Propritts du
Explorateur Navigation entre vue graphique et xml

Output

Figure 3.5 Aperu de linterface Android Studio

ordinateur, confirmez en lui indiquant de toujours faire confiance cet ordinateur.

Une fois que votre application est compile, un fichier .apk est cr
i dans le dossier app\build\outputs\apk de votre rpertoire de travail.
Cest lexcutable de votre application. Cest ce fichier que vous de-
vez dployer pour distribuer votre application. Le contenu de ce fichier
peut tre inspect laide de nimporte quel logiciel standard de com-
pression/dcompression de fichiers.

Se reprer dans le projet


La figure 3.5 montre les principaux lments de linterface Android Studio.

Tout projet Android doit respecter une hirarchie bien prcise qui permettra au
compilateur de retrouver les diffrents lments et ressources lors de la gnration
de lapplication. Cette hirarchie favorise la modularit des applications Android.
A la cration du projet, Android Studio cre automatiquement des dossiers pour
contenir les fichiers de code Java, les fichiers XML, et les fichiers multimdias.
Lexplorateur de projet vous permettra de naviguer dans ces dossiers.
Les dossiers que nous utiliserons le plus sont java et res. Le premier contient le
code Java qui dfinit le comportement de lapplication (situ dans le rpertoire

Polytech Paris Sud Dima Rodriguez


Tutoriel Android 14

de votre projet sous app\src\main) et le second comporte des sous dossiers (dans
app\src\main\res) o sont stocks les ressources qui dfinissent linterface de
lapplication (lapparence).

La sparation entre fonctionnalit et apparence est un point essentiel de la


i philosophie Android.

Le code de la classe principale de lapplication (Principale.java) est situ dans


le sous dossier android.polytech.monappli de java. Vous trouverez en annexe une
brve explication du code qui y est gnr par dfaut. Cest dans le dossier java
que seront enregistres toutes les classes que nous allons crer dans ce projet 3
Par ailleurs, tout ce qui touche linterface utilisateur sera intgr dans les sous
dossiers de res, dont voici une brve description :
layout regroupe les fichiers XML qui dfinissent la disposition des composants
sur lcran. Il contient dj, ds la cration du projet, le layout de lac-
tivit principale que nous avons cre. Deux fichiers XML sont cre par
Android Studio : activite_principale.xml et content_principale.xml. Le
premier dfinit lapparence gnrale de lactivit : sa disposition, sa taille,
sa barre doutil, ventuellement des boutons daction flottant (dans notre
cas un bouton email est rajout) ainsi que son layout qui nest autre que
content_principale.xml. Ce sera donc ce dernier que nous manipulerons
pour disposer les composants de lactivit et crer notre interface graphique.
drawable-**** contient tout lment qui peut tre dessin sur lcran : images
(en PNG de prfrence), formes, animations, transitions, etc.. Cinq dossiers
drawable permettent aux dveloppeurs de proposer des lments graphiques
pour tout genre dappareil Android en fonction de sa rsolution. En po-
pulant correctement ces dossiers on peut ainsi crer des applications avec
une interface qui sadapte chaque rsolution dcran avec un seul fichier
.apk.

ldpi low-resolution dots per inch. Pour des images destines des
crans de basse rsolution (~120dpi)
mdpi pour des crans de moyenne resolution (~160dpi)

3. Vous remarquerez quun classe ApplicationTest est cre automatiquement par An-
droid Studio. Cette classe vous permet dcrire un code pour tester les diffrentes fonction-
nalits de votre application plutot que de les tester la main. Pour plus dinformations sur la
cration de scnario de test consulter cette page.

Polytech Paris Sud Dima Rodriguez


Tutoriel Android 15

hdpi pour des crans de haute rsolution (~240dpi)


xhdpi pour des crans ayant une extra haute rsolution (~320dpi)
xxhdpi pour des crans ayant une extra extra haute rsolution (~480dpi).

menu contient les fichiers XML dfinissant les menus


mipmap contient les images de licne de votre applications sous diffrentes
rsolutions.
values contient les fichiers XML qui dfinissent des valeurs constantes (des
chaines de caractres, des dimensions, des couleurs, des styles etc.)
gradle Android Studio utilise un systme quon appelle Gradle pour com-
piler et gnrer les applications. Pour fonctionner le Gradle a besoin dun
script qui dfinit les rgles de compilation et gnration (configuration et
dpendances). Android Studio cre ainsi un script gradle pour chaque
module (build.gradle (Module :app)) du projet ainsi quun script pour le
projet entier (build.gradle (Project : MonAppli)) 4 . Dans le build.gradle de
lapplication on dfinit entre autre la version du SDK utilise pour la com-
pilation, la version minimale du SDK ncessaire pour faire tourner lapplica-
tion (rtro-compatibilit), lidentifiant de lapplication (le nom du package),
etc. 5

Vous trouverez galement dans le dossier manifests du projet un fichier nomm


AndroidManifest.xml. Ce fichier est obligatoire dans tout projet Android, et doit
toujours avoir ce mme nom. Ce fichier permet au systme de reconnaitre lappli-
cation.

On peut accder une description rapide des classes ou des attributs


i XML en slectionnant leur nom dans lditeur et appuyant sur Ctrl+Q.

Modification de linterface utilisateur


Pour linstant notre application ne fait quafficher un message sur lcran, dans
cette section nous allons modifier linterface pour y mettre un champ de saisie et
4. Android Studio spare projet et module. Le module cest une application ou une librairie.
En gnral un projet contient un seul module de prfrence quand il sagit dapplications, mais
peut contenir plusieurs modules quand on dveloppe des librairies.
5. Le Gradle est lquivaent du gcc en lanage C et le gradle.build lquivalent du makefile.

Polytech Paris Sud Dima Rodriguez


Tutoriel Android 16

un bouton.
Une interface utilisateur est en gnral constitue de ce quon appelle des ViewGr-
oups qui contiennent des objets de type View ainsi que dautres ViewGroups.
Un View est un composant, tel un bouton ou un champ de texte, et les ViewGrou-
ps sont des conteneurs qui dfinissent une disposition des composants (Views)
qui y sont placs. ViewGroup dfinit la classe de base des diffrents layouts.

Comprendre le layout
La disposition de notre interface est dfinie dans le fichier content_principale.xml
situ dans le dossier layout de res. Ouvrez ce fichier.

La premire balise que vous retrouverez est <RelativeLayout> qui dfinit


le type du conteneur qui compose linterface, il impose la faon dont les com-
posants seront disposs. Plusieurs types de conteneurs existent, les plus com-
muns sont RelativeLayout, LinearLayout, TableLayout, GridView,
ListView. Lutilisation dun RelativeLayout, par exemple, implique que les
composants seront placs selon des positions relatives les uns par rapport aux
autres. Un LinearLayout implique une disposition linaire verticale ou horizon-
tale, un GridView permet la disposition des lments selon une grille qui peut
dfiler, etc.
A lintrieur de la balise <RelativeLayout> vous verrez un ensemble dattributs
dfinis selon le format

plateforme:caractristique=valeur

Par exemple le premier attribut xmlns:android prcise o sont dfinis les ba-
lises Android utilises dans ce fichier.
La balise <TextView>, fille de la balise <RelativeLayout>, dfinit un com-
posant texte qui sera plac sur le layout. En effet, cest sur ce composant l quon
crit le Hello World quaffiche notre application. Cette chaine de caractre est
dfinie par lattribut android:text.

Modifier le type de layout


Nous allons maintenant modifier le type du layout pour le transformer en Linear-
Layout. La figure 3.6 trace la drivation de la classe LinearLayout. Nous
rajouterons ensuite nos composants sur ce layout dans une disposition linaire.

Polytech Paris Sud Dima Rodriguez


Tutoriel Android 17

Figure 3.6 Hirarchie de LinearLayout


Les layouts sont des ViewGroup qui sont eux mmes des View [1]

Dans le fichier content_principale.xml


. supprimez llment <TextView>
. remplacez llment <RelativeLayout> par <LinearLayout>
. rajoutez lattribut android:orientation et mettre sa valeur hori-
zontal
Le code dans le fichier devient ainsi

<LinearLayout
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:orientation="horizontal"
app:layout_behavior="@string/
appbar_scrolling_view_behavior"
tools:context="android.polytech.monappli.
Principale"
tools:showIn="@layout/activite_principale">

</LinearLayout>

Rajouter dun champ de saisie


. Rajoutez un lment <EditText> dans le <LinearLayout> tel que

Polytech Paris Sud Dima Rodriguez


Tutoriel Android 18

<EditText
android:id="@+id/chp_saisie"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:hint="@string/str_chp_saisie" />

Nous avons ainsi plac un champ de saisie avec les attributs suivants :
android :id permet de donner un identifiant unique ce View quon utilisera
pour rfrencer cet objet lintrieur de notre code.
Le symbol @ est ncessaire pour faire rfrence un objet ressource partir
dun fichier XML. id est le type de ressource et chp_saisie est le nom
quon donne notre ressource. Le symbole + est utilis pour dfinir un ID
pour la premire fois. Il indique aux outils du SDK quil faudrait gnrer
un ID pour rfrencer cet objet. Le symbole + ne doit tre utilis quune
seule fois au moment o on dclare la ressource pour la premire fois. Par
la suite si on veut faire rfrence cet lment, partir dun XML, il suffira
dcrire @id/chp_saisie.
android :layout_width permet de spcifier la largeur de lment.
wrap_content signifie que le View doit tre aussi large que nces-
saire pour sadapter la taille de son contenu. Si en revanche on prcise
match_parent comme on lavait fait pour le LinearLayout, dans
ce cas le EditText occuperait toute la largeur de lcran puisque sa lar-
geur sera celle de son parent c--d le LinearLayout
android :layout_height idem que pour le layout_width mais pour la hau-
teur
android :hint prcise le texte par dfaut afficher dans le champ de saisie
quand il est vide. Nous aurions pu prciser directement la chaine de carac-
tre ici code en dur, mais on prfre utiliser plutt une ressource quon
dfinira dans strings.xml . Noter que lutilisation de + ici nest pas nces-
saire parce quon fait rfrence une ressource concrte (quon dfinira
dans le fichier xml) et non pas un identifiant que le SDK doit crer.

Privilgiez toujours lutilisation des ressources strings plutt que des chaines
i de caractres codes en dur. Cela permet de regrouper tout le texte de votre
interface dans un seul endroit pour simplifier la recherche et la mise jour

Polytech Paris Sud Dima Rodriguez


Tutoriel Android 19

du texte, de plus ceci est indispensable pour que votre application puisse tre
multilingue. lIDE vous affichera un avertissement en cas de non respect de
cette recommandation.

Aprs la modification du code que nous venons de faire, quand vous sauvegarderez
le fichier, un message derreur vous indiquera que lidentifiant str_chp_saisie
nest pas connu. Nous allons donc le dfinir.
. Ouvrez le fichier strings.xml qui se trouve dans res>values
. Rajoutez une nouvelle string nomme str_chp_saisie et dont la valeur
est Entrer un texte
Votre fichier strings.xml ressemblera donc ceci

<resources>
<string name="app_name">MonAppli</string>
<string name="str_chp_saisie">Entrer un texte</
string>
<string name="action_settings">Settings</string>
</resources>

Compilez et lancez lapplication, lmulateur affichera un cran tel que dans la


figure 3.7. Tapez un texte et remarquez comment la taille du champ de saisie
sadapte la longueur du texte.

Rajouter un bouton
. Dans le fichier strings.xml rajoutez une chaine de caractre qui sappelle
"btn_envoyer" et qui vaut Envoi.
. Dans le fichier du layout rajoutez un lment <Button> tel que

<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/btn_envoyer" />

Lancez lapplication. Vous devez voir un bouton cot du champ de saisie (fig.3.8a).
Si vous souhaitez que votre champ de saisie occupe toute la largeur de lcran
qui reste aprs le positionnement du bouton il faut spcifier un poids de 1 au
EditText et une largeur de 0.

Polytech Paris Sud Dima Rodriguez


Tutoriel Android 20

Figure 3.7 Premier test de lapplication modifie

(a) Disposition par dfaut (b) Le EditText a un poids de 1

Figure 3.8 Champ de saisie et bouton

Polytech Paris Sud Dima Rodriguez


Tutoriel Android 21

<EditText ...
android:layout_weight="1"
android:layout_width="0dp"
... />

Rpondre aux vnements


Pour rpondre un appui sur le bouton il suffit de dfinir un attribut an-
droid:onClick pour le bouton en lui donnant comme valeur le nom de la
mthode qui devrait tre appele quand le bouton est appuy, et dimplmenter
cette mthode de rponse dans la classe principale de lactivit.
. Dans le fichier xml du layout, rajoutez lattribut android:onClick
llment bouton tel que :
<Button
...
android:onClick="envoiMessage"
... />
. Dans la classe Principale rajoutez la mthode
/** Mthode appele quand on appuie sur Envoi */
public void envoiMessage (View view){
// le code de traitement ira ici
}

Il faut absolument respecter cette signature pour la mthode afin que le


! systme puisse lassocier au nom donn par android:onClick. Le para-
mtre view est rempli par le systme et correspond llment qui a gnr
lvnement (le bouton Envoi dans notre cas).
Avant daller plus loin dans le traitement, vous pouvez dj tester si lappel seffec-
tue correctement quand le bouton est appuy. Pour cela, mettez un point darrt
lintrieur de la mthode envoiMessage() et lancez lapplication en mode
Debug (fig. 3.5).
. Dans lmulateur appuyez sur le bouton Envoi et vrifiez que le programme
entre bien dans la mthode envoiMessage().
. Arrtez le dbogage et revenez en mode Java en cliquant sur le bouton
correspondant en haut droite de lIDE.

Polytech Paris Sud Dima Rodriguez


Tutoriel Android 22

Figure 3.9 Cration dune nouvelle activit

Crer et lancer une autre activit


Dans la suite, nous allons rpondre lappui du bouton en lanant une deuxime
activit qui affichera le texte quon aurait tap dans le champ de saisie de lactivit
principale.

Cration dune activit


. Dans la barre de menu dAndroid Studio allez dans File > new et
slectionner Activity, puis Blank Activity.
. Dfinissez les paramtres de lactivit comme dans la figure 3.9
En plus des champs dj vus au moment de la cration de lactivit principale,
vous remarquez que pour notre nouvelle activit il faut dfinir une activit parent.
Ceci est utile pour implmenter le comportement par dfaut du bouton retour.
Une fois lactivit cre Android Studio gnre :
. un fichier AffichMessage.java contenant le code la classe
. les fichiers xml correspondant au layout de la nouvelle activit
. un lment <activity> dans le fichier AndroidManifest.xml et affecte
ses attributs avec les valeurs que nous avons prcises lors de la cration
de lactivit

<activity

Polytech Paris Sud Dima Rodriguez


Tutoriel Android 23

android:name=".AffichMessage"
android:label="@string/
title_activity_affich_message"
android:parentActivityName=".Principale"
android:theme="@style/AppTheme.NoActionBar">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value="android.polytech.monappli.
Principale" />
</activity>

. une chaine de caractre dans le fichier strings.xml correspondant au titre


de notre nouvelle activit.

<resources>
...
<string name="title_activity_affich_message">
MonMessage</string>
...
</resources>

Lancement de lactivit
Pour faire communiquer les deux activs (lactivit principale et celle que nous
venons de crer) il faut passer par un Intent. Ce dernier reprsente lintention de
faire quelque chose, et permet lactivit principale de lancer lactivit daffichage.
Dans la mthode envoiMessage() de la classe Principale :
. Crez une intention,
Intent intent = new Intent(this, AffichMessage.class);

sans oublier dimporter la classe. (lIDE vous le propose automatiquement


Alt+Entr)
import android.content.Intent;

A la construction de lobjet intent, nous prcisons deux arguments : le


premier est un objet de type Context qui fait rfrence lapplication

Polytech Paris Sud Dima Rodriguez


Tutoriel Android 24

qui cre lintention et le deuxime prcise le nom (de la classe) de lacti-


vit qui reoit lintention. Comme le Intent peut tre utilis pour faire
communiquer deux applications, il ne suffit pas de prciser uniquement le
nom de lactivit qui le cre mais il faut galement dfinir lapplication qui
linvoque.
. lancez lactivit
startActivity(intent);

Compilez et excutez lapplication et appuyez sur le bouton Envoi. La nouvelle


activit se lance, pour linstant elle est vide. Notez que le bouton de retour est
dj fonctionnel et permet de remonter lactivit principale. Ceci est d au fait
que nous lavons indique comme activit parent au moment de la cration de
notre activit daffichage.

Communication entre les activits


Envoyer un message

Si nous souhaitons que le texte tap dans lactivit principale soit affich dans
lactivit daffichage, il faut faire communiquer les deux activits de sorte ce
que la premire envoie le texte la deuxime. Ceci seffectue en utilisant le mme
Intent qui a servi pour le lancement de lactivit. En effet une intention peut aussi
transporter un paquet de donnes.
Modifier la mthode envoiMessage() pour quelle contienne le code ci-dessous,
sans oublier dimporter les classes ncessaires.
public void envoiMessage (View view){
Intent intent = new Intent(this, AffichMessage.class);
EditText editText = (EditText) findViewById(R.id.
chp_saisie);
String message = editText.getText().toString();
intent.putExtra(MESSAGE_SUPP, message);
startActivity(intent);
}

La mthode findViewById() permet de retrouver un objet de type View


partir de son identifiant. Ici elle renvoie lobjet correspondant chp_saisie
quon cast en EditText. La variable editText contient dsormais lobjet

Polytech Paris Sud Dima Rodriguez


Tutoriel Android 25

champ de saisie que nous avions pos sur linterface principale. Nous rcup-
rons ensuite la chaine de caractre que contient ce champ en appelant edit-
Text.getText().toString(). Cette chaine est ensuite stocke dans la va-
riable message qui est passe en paramtre la mthode putExtra() de lobjet
intent afin de charger lintention avec ce message. Afin que lactivit daffichage
puisse identifier et rcuprer les donnes supplmentaires transportes par linten-
tion il faut dfinir une cl pour ces donnes moyennant une constante publique.
Nous dfinissons donc la constante MESSAGE_SUPP dans la classe Principale.
public class Principale extends ActionBarActivity {
public final static String MESSAGE_SUPP = "android.
polytech.monappli.MESSAGE";
...

En gnral on dfinit ce genre de cl en utilisant le nom de notre package comme


prfixe. Ceci garantit lunicit des cls dans le cas o notre application interagit
avec dautres.

Rcuprer et afficher le message

Arrivs ce point, nous avons fait en sorte ce que lactivit principale envoie un
message lactivit daffichage. Il nous reste maintenant rcuprer ce message
dans AffichMessage. Pour cela il suffit de rajouter le code ci-dessous dans
la mthode onCreate() de la classe AffichMessage . Cette mthode est
appele la cration de lactivit.
Intent intent = getIntent();
String message = intent.getStringExtra(Principale.MESSAGE_SUPP
);

Ensuite, pour afficher le message nous allons crer un TextView, lui affecter le
message puis le rajouter au layout.
Dans les sections prcdentes nous avons appris crer et rajouter des
composants partir du fichier xml, ici nous le faisons dans le code.
Voici le code complet de la mthode onCreate()
protected void onCreate(Bundle savedInstanceState) {
/*appeler onCreate de la classe mre*/
super.onCreate(savedInstanceState);
/*rcuprer le message transport par lintention*/

Polytech Paris Sud Dima Rodriguez


Tutoriel Android 26

Intent intent = getIntent();


String message = intent.getStringExtra(Principale.
MESSAGE_SUPP);
/*crer le textView*/
TextView textView = new TextView(this);
textView.setTextSize(40);
textView.setText(message);
/*dfinir le layout activite_affich_message comme
tant le layout de lactivit*/
setContentView(R.layout.activite_affich_message);
/*rcuprer le layout*/
TableLayout monLayout = (TableLayout) findViewById(R.
id.affich_message_layout);
/*rajouter le textView au layout*/
monLayout.addView(textView,0);
/*dfinition de la barre daction */
Toolbar toolbar = (Toolbar)findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
/*dfinition du bouton flottant*/
FloatingActionButton fab = (FloatingActionButton)
findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Snackbar.make(view, "...", Snackbar.
LENGTH_LONG)
.setAction("Action", null).show();
}
});
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
...
...
}

Dans le fichier content_affiche_message.xml rajoutez un identifiant pour le layout


tel que

android:id="@+id/affich_message_layout"

Polytech Paris Sud Dima Rodriguez


Tutoriel Android 27

et changez le RelativeLayout en TableLayout. Nous aurions pu laiss en


relatif mais la disposition tabulaire nous servira pour la suite du tutoriel.

Excutez lapplication, entrez un texte dans le champ de saisie et appuyez sur le


bouton Envoi. Votre texte devrait apparaitre sur lcran suivant.

Crer des animations


Il existe deux faons de faire des animations avec Android. La premire est
base sur laffichage dune srie dimages qui constituent lanimation. Cest la
mthode la plus simple. La deuxime mthode, quant elle, repose sur le calcul de
transformations mathmatiques pour animer graphiquement un objet. Alors que
la premire, base sur les images, est gourmande en terme despace de stockage
(taille de lapplication) la deuxime, dite vectorielle, ncessite plus de ressources
de calculs. Dans le cadre de ce tutoriel nous nous limiterons lintroduction de la
mthode la plus simple, vous pouvez vous rfrez [2] pour une explication des
animations vectorielles.
Pour commencer il faut crer, pour chaque rsolution, une srie dimages qui
composera lanimation. Joint ce tutoriel nous proposons 12 images dfinissant
une squence de rotation de la terre pour la rsolution hdpi.
. Copiez les images dans le dossier app\src\main\res\drawable
. A laide dun clic droit sur le dossier res dans lexplorateur Android Stu-
dio slectionnez New>Andriod Resource File nommez-le anim_terre.xml
et renseignez les champs comme dans la figure 3.10. Cliquez ok.
. Modifiez le code du fichier cr tel que

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


<animation-list xmlns:android="http://schemas.android.
com/apk/res/android" android:oneshot="false">
<item android:drawable="@drawable/image1"
android:duration="250" />
<item android:drawable="@drawable/image2"
android:duration="250" />
<item android:drawable="@drawable/image3"
android:duration="250"/>

Polytech Paris Sud Dima Rodriguez


Tutoriel Android 28

Figure 3.10 Cration dune ressource animation

<item android:drawable="@drawable/image4"
android:duration="250" />
<item android:drawable="@drawable/image5"
android:duration="250" />
<item android:drawable="@drawable/image6"
android:duration="250" />
<item android:drawable="@drawable/image7"
android:duration="250" />
<item android:drawable="@drawable/image8"
android:duration="250" />
<item android:drawable="@drawable/image9"
android:duration="250" />
<item android:drawable="@drawable/image10"
android:duration="250" />
<item android:drawable="@drawable/image11"
android:duration="250" />
<item android:drawable="@drawable/image12"
android:duration="250" />
</animation-list>

Le paramtre android:oneshot est mis false" pour que lanimation


boucle indfiniment. Pour chacune des images il faut prciser android:duration

Polytech Paris Sud Dima Rodriguez


Tutoriel Android 29

qui dfinit la dure daffichage de limage en ms.


Pour faire apparaitre lanimation il faut rajouter un lment <ImageView> dans
le layout principal.

<ImageView
android:id="@+id/animTerre"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:contentDescription="@string/
anim_terre_descript"/>

Lattribut android:contentDescription permet de dfinir un label pour


limage. Android Studio donnera un avertissement si vous ne fournissez pas
cette description pour assurer laccessibilit de votre application tous les utilisa-
teurs. Noubliez pas de dfinir la chaine de caractre anim_terre_descript
dans le fichier string.xml.
Il reste plus qu charger et lancer lanimation. Dans le code de la mthode on-
Create() de la classe Principale, rajoutez le code ci-dessous aprs lappel
onCreate() de la classe mre et lappel setContentView().
/* Charger le ImageView qui va contenir lanimation et son
fond comme tant la ressource xml que nous avons cre*/
ImageView img = (ImageView) findViewById(R.id.animTerre);
img.setBackgroundResource(R.drawable.anim_terre);
/*rcuprer le background, transform en un objet
AnimationDrawable*/
AnimationDrawable frameAnimation = (AnimationDrawable) img.
getBackground();
/*dmarrer lanimation*/
frameAnimation.start();

Excutez lapplication, vous verrez lanimation safficher droite de lcran cot


du bouton (fig. 3.11). Un LinearLayout ne compte quune ligne, tous les l-
ments sont donc disposs sur la mme ligne. Si on souhaite placer lanimation sur
une ligne part, il faudrait mettre deux LinearLayout ou bien changer le type
de layout.
Pour changer de layout on pourrait bien entendu modifier directement le code xml
pour remplacer <LinearLayout> par un autre type en adaptant les attributs du

Polytech Paris Sud Dima Rodriguez


Tutoriel Android 30

Figure 3.11 Animation en LinearLayout

layout, ainsi que ceux des lments qui y sont disposs, mais on pourrait galement
le faire graphiquement.
. Ouvrez le fichier content_principale.xml
. Slectionnez longlet Design (fig.3.5). Dans larborescence des composant
droite le LinearLayout apparait (si ce nest pas le cas cliquez tout simple-
ment sur lappareil). A laide dun clic droit sur LinearLayout slectionnez
Morphing et passez en RelativeLayout(fig. 3.12 )
. Passez en mode Text. Vous verrez certains attributs surligns car ne sont
pas compatible avec le nouveau layout. Comme par exemple android:layout_a
android:layout_marginLeft, android:layout_weight. Supprimez-
les.
. Repasse en mode Design et positionnez les lments comme vous le sou-
haitez sur linterface.
Excutez lapplication, lactivit devrait ressembler la figure 3.13
Remarquez que dans le mode Design vous pouvez directement glisser et dposer
des composants sur linterface. Le fichier xml sera mis jour automatiquement.
Cest la faon la plus simple et la plus rapide pour faire la conception graphique
de votre activit.

Cration et contrle des animations partir du code


Nous venons de crer une animation partir des fichiers xml, cependant dans
certaines situations il est utile de crer et de contrler des animations depuis le
code Java. Nous allons, dans ce qui suit, refaire la mme animation dans lacti-
vit AffichMessage mais, cette fois, partir du code de la classe. Nous en

Polytech Paris Sud Dima Rodriguez


Tutoriel Android 31

Figure 3.12 Modification du layout

Figure 3.13 Animation en RelativeLayout

Polytech Paris Sud Dima Rodriguez


Tutoriel Android 32

profiterons pour apprendre crer des boutons dans le code Java et grer leurs
vnements.
. Crez trois donnes membres de la classe AffichMessage tels que
protected Button playBtn;
protected Button stopBtn;
protected ImageView globe;

. Dans la mthode onCreate() crez le globe et associez-lui lanimation


cre prcdemment
globe = new ImageView(this);
globe.setImageResource(R.drawable.anim_terre);

. Toujours dans onCreate(), crez les deux boutons et grez leurs clics
/*crer le bouton stop*/
stopBtn = new Button(this);
stopBtn.setText(R.string.btn_stop);
/*dfinir et implmenter le callback du Click*/
stopBtn.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
AnimationDrawable monAnimation =(
AnimationDrawable)globe.getDrawable();
monAnimation.stop();
}
});

/*crer le bouton play*/


playBtn = new Button(this);
playBtn.setText(R.string.btn_play);
/*dfinir et implmenter le callback du Click*/
playBtn.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
AnimationDrawable monAnimation =(
AnimationDrawable)globe.getDrawable();
monAnimation.start();
}
});

Pensez dfinir les chaines de caractres btn_play, et btn_stop dans


string.xml
. Ajoutez globe, play_btn etstop_btn au layout
monLayout.addView(globe,1);

Polytech Paris Sud Dima Rodriguez


Tutoriel Android 33

monLayout.addView(playBtn,2);
monLayout.addView(stopBtn,3);

Excuter et tester le comportement de lapplication.

Crer un View personnalis pour grer un jeu


La plupart du temps quand il sagit de concevoir un jeu, il est indispensable de
pouvoir dessiner sur lcran. Dans cette section nous allons crer une classe drive
de View que nous personnaliserons pour faire dplacer une image sur lcran et
interagir avec lutilisateur.

Cration de la classe MonViewPerso


. Dans lexplorateur dAndroid Studio faites un clic droit sur le package
contenant vos classes (android.polytech.monappli) et slectionnez New>
Java Class
. Nommez-la MonViewPerso
. Cliquez sur Ok, Android Studio gnre un fichier MonViewPerso.java
. Faites hriter cette nouvelle classe de View.
Une erreur saffiche dj, il faut dfinir explicitement un constructeur qui fait appel
au constructeur de la classe de base. En effet si nous ne le dfinissons pas, un
constructeur par dfaut, sans paramtre, est rajout implicitement et fait appel au
constructeur View() sans paramtre, or ce dernier nexiste pas. La classe View
ne dfinit que des constructeurs avec arguments.
Nous dfinirons donc le constructeur ci dessous
public MonViewPerso(Context context,AttributeSet attrs) {
super(context,attrs);
}

Afin de dfinir comment notre vue se dessine sur lcran il faut implmenter la
mthode onDraw()qui sera invoque automatiquement par le systme chaque
fois quil a besoin dafficher ou de rafraichir le View.
Nous dfinirons dabord un objet de dessin (une sorte de pinceau) comme attribut
de la classe MonViewPerso
Paint p = new Paint();

Polytech Paris Sud Dima Rodriguez


Tutoriel Android 34

que nous utiliserons dans la mthode onDraw() comme suit


public void onDraw (Canvas canvas) {

/*dfinir la couleur de lobjet de dessin */


p.setColor(Color.BLACK);
/*dfinir son style en remplissage*/
p.setStyle(Paint.Style.FILL);
/*dessiner un rectangle qui occupe la totalit du View*/
canvas.drawRect(0,0,getWidth(),getHeight(), p);

/*dfinir une autre couleur pour dessiner un texte*/


p.setColor(Color.WHITE);
/*dfinir la taille du texte*/
p.setTextSize(20);
/*dfinir le centre du texte comme tant son origine*/
p.setTextAlign(Paint.Align.CENTER);
/*dessiner le texte en positionnant son origine au centre du
View */
String texte = getResources().getString(R.string.hello_world);
canvas.drawText(texte, getWidth()/2, getHeight()/2, p);
}

Avec le code ci-dessus notre vue consistera en un cran noir au centre duquel on
affiche Hello World ! en blanc. Largument canvas, que le systme passe la
mthode onDraw(), reprsente la zone de dessin de lcran.
La mthode
public void drawText (String text, float x, float y, Paint paint);

dessine lorigine du texte la position donne par x et y. Lorigine du texte est


dfinie avec
public void setTextAlign (Paint.Align align);

Notez quici nous avons juste affich un texte dfini dans strings.xml, mais il est
galement possible de crer des chaines de caractres formates pour, par exemple,
rcuprer des valeurs de variables. Modifiez le code pour dfinir le texte tel que
texte = String.format("%s %d x %d",texte,canvas.getWidth(),
canvas.getHeight());

pour afficher, en plus du Hello World, la rsolution de lcran.


Notez quici nous rcuprons les dimensions du canvas qui ne sont pas gales
celle du View que nous avions utilises dans drawText(). En effet la taille de

Polytech Paris Sud Dima Rodriguez


Tutoriel Android 35

notre vue est infrieure celle de lcran.


Si vous voulez changez la taille du texte il suffit de rajouter
p.setTextSize(50);

avant lappel a drawText()en lui donnant en paramtre la taille que vous sou-
haitez. Pour rendre lapplication plus modulaire, sadaptant aux appareils, on pr-
fre dfinir la taille de texte dans le fichier de ressources ddi aux dimensions
dimens.xml

<dimen name="myFontSize">20sp</dimen>

lutilisation de sp implique que la taille de votre texte sadaptera non seulement


la rsolution de lappareil mais aussi aux prfrences de police que lutilisateur a
paramtr.
Il faut ensuite rcuprer la taille partir du code pour la passer setTextSize()
int size = getResources().getDimensionPixelSize(R.dimen.
myFontSize);
p.setTextSize(size);

Cration dune activit qui contiendra la vue personnalise


Afin dafficher notre vue il faut lassocier une activit. Nous commencerons par la
cration dune activit que nous nommerons MonJeu, comme vu prcdemment.
Nous dfinirons lactivit Prinicpale comme activit parent de MonJeu.
Une fois lactivit cre avec le Wizard, Android Studio la rajoute au Android-
Manifest.xml et cre le .java associ et les .xml de son layout.
Pour lancer cette activit nous rajouterons un bouton sur linterface principale.
Nous avons dj vu comment rajouter un lment sur un layout dans le fichier
xml, mais nous pouvons galement le faire dans le Design.
. Ouvrez le fichier content_principale.xml
. Slectionnez longlet Design.
. Dans la palette de composants, slectionnez un bouton, glissez-le et dposez-
le sur linterface de lactivit.
. Dans la fentre de proprits dfinir :
Id : @+id/btn_jeu
Text : @string/btn_jeu (sans oublier de dfinir btn_jeu dans strings.xml)

Polytech Paris Sud Dima Rodriguez


Tutoriel Android 36

On Click : jouer
. Le fichier content_principale.xml est mis jour avec les proprits que
nous venons de dfinir
. Dans le code de la classe Principale implmenter la mthode jouer()
qui rpondra aux appuis sur le bouton
public void jouer (View view){
Intent intent = new Intent(this, MonJeu.class);
startActivity(intent);
}

Si vous testez lapplication (fig.3.14 ), lappui sur le bouton que nous venons de
rajouter lancera lactivit MonJeu. Cependant celle ci nest pas encore associe
notre vue. Il nous reste donc rajouter un lment <MonViewPerso> sur le
layout de lactivit.
. Modifier le fichier content_mon_jeu.xml en rajoutant un lment <Mon-
ViewPerso> tel que

<android.polytech.monappli.MonViewPerso
android:id="@+id/maVue"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentLeft="true"
android:layout_alignParentRight="true"
android:layout_alignParentTop="true" />

Vous pouvez galement faire cela de faon graphique dans le Design. En effet,
notre vue personnalise apparait maintenant dans la palette et nous pouvons la
rajouter sur lactivit avec un glisser-dposer.

Interaction avec lutilisateur


Dans la suite nous souhaitons afficher une image sur la vue personnalise et per-
mettre lutilisateur de la dplacer en la touchant.
. Rajoutez limage au projet. Joint ce tutoriel nous proposons des images
de plantes pour diffrentes rsolutions qui sont utilises dans [2]. Placez
les images dans le dossiers drawable.

Polytech Paris Sud Dima Rodriguez


Tutoriel Android 37

Figure 3.14 Ajout dun bouton pour lancer le jeu

. Dans la classe MonViewPerso crez des attributs pour contenir limage,


sa taille et sa position
Bitmap planet =null;
float xOri=0,yOri=0;
int largImage,hautImage;

. Dans le constructeur de MonViewPerso, rcuprez limage et ses dimen-


sions 6
BitmapDrawable d = (BitmapDrawable) getResources().
getDrawable(R.drawable.earth);
planet = d.getBitmap();
largImage=planet.getWidth();

6. Jusqu la version API 21, getDrawable() sutilisait avec un seul paramtre, depuis cette
mthode a t modifie et ncessite un deuxime paramtre qui dfinit le thme. Si vous lutilisez
avec un seul paramtre, lIDE vous indiquera que cette mthode est obsolte mais compilera quand
mme. Si vous utilisez deux paramtres (en passant par exemple null en deuxime argument)
et que votre minSdkVersion est infrieur 21, une erreur se produit. Dans ce cas, vous avez deux
possibilits :
soit vous changez le minSdkVersion (dans le gradle.build) pour le mettre 21 mais dans ce
cas vous perdez la compatibilit avec les versions plus anciennes.
ou bien, vous conditionnez lappel de getDrawable() par
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP)
si cest vrai vous faites lappel avec deux paramtres, dans le cas contraire vous lappelez
avec un seul.

Polytech Paris Sud Dima Rodriguez


Tutoriel Android 38

hautImage=planet.getHeight();

. Dans la mthode onDraw()dessinez limage (aprs drawRect())


canvas.drawBitmap(planet, xOri, yOri, p);

Excutez lapplication, vous devriez voir limage safficher en haut gauche de


votre vue (fig.3.15). Afin de ragir au toucher de lutilisateur il faut implmenter
la mthode onTouchEvent() qui est appele quand lutilisateur touche lcran.
public boolean onTouchEvent (MotionEvent event){
int action = event.getAction();
switch (action) {
case MotionEvent.ACTION_DOWN: /*on a touch lecran*/
/*calculer la distance de la touche lorigine de limage
*/
deltaX = event.getX() - xOri;
deltaY = event.getY() - yOri;
/*tester si on a touch la plante*/
if (deltaX>= 0 && deltaX <= largImage
&& deltaY>= 0 && deltaY <= hautImage)
/*on a touch limage, permettre le movement*/
move = true;
break;

case MotionEvent.ACTION_MOVE: /* le doigt bouge sur lcran*/


if(move){
/*si le movement est permis, mettre jour les
coordonnes de limage*/
xOri = event.getX() - deltaX;
yOri = event.getY()- deltaY;
}
break;

case MotionEvent.ACTION_UP: /*le doigt a quitt lcran*/


move = false;
break;
}
/*forcer un repaint pour rafraichir laffichage*/
invalidate ();

return true;
}

Les attributs deltaX, deltaY et move sont dfinis tels que

Polytech Paris Sud Dima Rodriguez


Tutoriel Android 39

Figure 3.15 Activit avec vue personnalise

float deltaX=0, deltaY=0;


boolean move=false;

Excutez et testez lapplication. On pourrait rajouter des conditions afin dinterdire


la plante de sortir de la vue.

Temporisation
Dans certaines applications on est parfois amen effectuer une tche aprs un
certain dlai, ou bien priodiquement toutes les x ms. Nous allons, dans la suite,
introduire la notion de temporisation que nous utiliserons pour faire dplacer notre
plante le long de lcran.
Pour ce faire nous passerons par un objet Handler qui permet de programmer
lappel dune mthode aprs un dlai dtermin.
. Dans la classe MonViewPerso, dfinir un attribut de type Handler tel
que
Handler timerHandler = new Handler();

. Dans le constructeur poser une tche excuter aprs 0ms


timerHandler.postDelayed(updateTimerThread, 0);

Polytech Paris Sud Dima Rodriguez


Tutoriel Android 40

updateTimerThread est un objet de type Runnable que nous dfini-


rons dans un instant. Le fait de poster cet objet avec un dlai, met lappel
sa mthode Run() dans la queue dexcution du processus principal pour
tre excute une fois le dlai coul. Autrement dit, le postDelayed()
programme lappel de la mthode Run() de updateTimerThread dans
0ms.
. Dfinir un attribut de type Runnable tel que
private Runnable updateTimerThread = new Runnable() {
public void run() {
/*mettre jour les coordonnes de la plante*/
xOri++;
yOri++;
/*forcer le rafraichissement de lcran*/
invalidate ();
/*reprogrammer lobjet pour une excution dans 50ms
*/
timerHandler.postDelayed(this, 50);
}
};

Avec ce code nous avons dfini ce quon appelle une classe anonyme. Les classes
anonymes en Java permettent de dclarer et instancier une classe en mme temps.
Elles ressemblent aux classes locales niches mais, contrairement ces dernires,
elles ne possdent pas de nom. On les utilise quand on veut utiliser une classe locale
une seule fois. On na pas besoin de la nommer puisquon ne fera plus rfrence
elle ailleurs.
La dfinition de la classe seffectue avec une expression au moment de lappel
du constructeur. Aprs linvocation du constructeur on crit un bloc contenant la
dfinition de la classe. Il suffit de mettre
. new avec le nom de linterface que la classe doit implmenter, ici Runnable,
ou bien le nom de la classe mre si ctait le cas.
. suivi des parenthses avec les paramtres du constructeur de la classe de
base. Ici, comme il sagit dune interface, il ny a aucun paramtre. (les
interfaces nont pas de constructeurs)
. puis, entre accolades, le corps de la classe en terminant par un ;
Lancez lapplication, vous verrez la plante se dplacer en diagonale sur lcran.
Notez quil est toujours possible de la dplacer avec le toucher.

Polytech Paris Sud Dima Rodriguez


Tutoriel Android 41

Figure 3.16 Menu de la barre daction

La classe Handler permet aussi la communication entre deux processus


i
diffrents, vous pouvez vous rfrez [3] pour en savoir plus.

Rajouter un bouton sur la barre daction


Lorsque nous avons cr nos activits, chaque fois nous sommes partis dune acti-
vit avec barre daction. En effet nos deux activits hritent de AppCompatActivity
qui assure le support dune barre daction, et dfinissent une barre daction avec
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);

Vous remarquerez que lactivit principale prsente dj un menu sur sa barre


daction contenant laction Settings (dont le code de rponse par dfaut ne fait
rien). Vous pouvez le faire apparaitre en cliquant sur le symbole en haut droite
de lcran (fig.3.16 ) .
En effet la classe Principale redfinit la mthode onCreateOptionsMenu()
dans la quelle elle cre un menu partir dune ressource xml menu_principale.
Nous allons, dans la suite, apprendre rajouter notre propre item du menu et lui
dfinir une action. Cest trs simple !
Les boutons de la barre daction sont dfinis dans un fichier xml du dossier res/-
menu. Pour ajouter un bouton daction lactivit principale nous allons modifier
le fichier menu_principale.xml pour y insrer un item

<item
android:id="@+id/action_mon_action"
android:title="@string/action_mon_action"
app:showAsAction="never"/>

Lattribut app:showAsAction dfinit quand et comment litem doit apparaitre


en tant que bouton sur la barre daction. En prcisant never notre item nap-
paraitra pas sur la barre mais uniquement quand on droule le menu. Si on prcise

Polytech Paris Sud Dima Rodriguez


Tutoriel Android 42

"ifRoom|withText" le texte de litem apparaitra sil y a de la place.


Lancez lapplication, droulez le menu, vous devriez y voir le nouvel item. Noubliez
pas de dfinir la chaine action_mon_action dans strings.xml.
Il nous reste maintenant implmenter laction excuter quand notre item est
slectionn par lutilisateur. Ceci seffectue dans la mthode onOptionsItem-
Selected() de la classe Principale. Reprez cette mthode et rajoutez les
lignes suivantes dans son corps
if (id == R.id.action_mon_action) {
//le traitement se fera ici
return true;
}

Lancement dune autre application


Nous allons maintenant utiliser notre bouton daction pour lancer une autre ap-
plication du systme : un navigateur par exemple. Comme nous lavons fait pour
lancer une deuxime activit de notre application, nous allons galement utiliser
un Intent pour lancer une deuxime application.
. Il faut dabord crer lintention
Uri webpage = Uri.parse("http://www.polytech.u-psud.fr");
Intent webIntent = new Intent(Intent.ACTION_VIEW, webpage);

La classe Uri fait rfrence un URI (uniform resource identifier ) 7 . Ici


on forme un objet Uri partir dune chaine de caractre dfinissant une
adresse web. Une localisation gographique, par exemple, peut aussi consti-
tuer un URI.
. Avant de la lancer, il faut tester sil existe une application capable de r-
pondre cette intention dans notre cas a revient tester si un navigateur
est prsent sur lappareil
PackageManager packageManager = getPackageManager();
List<ResolveInfo> activities = packageManager.
queryIntentActivities(webIntent, 0);
boolean isIntentSafe = activities.size() > 0;

7. lURI est une chaine de caractre qui identifie le nom dune ressource. LURL est une forme
dURI

Polytech Paris Sud Dima Rodriguez


Tutoriel Android 43

queryIntentActivities() retourne une liste dactivits capables de


grer lobjet Intent quon lui passe en paramtre.
. Si la liste nest pas vide, on peut lancer lintention en toute scurit
if (isIntentSafe) {
startActivity(webIntent);
}

Excutez lapplication et testez le lancement du navigateur.


Un Intent peut aussi porter un message destination de lautre application. On
pourrait par exemple lancer lapplication Calendrier en lui passant les dtails de
lvnement quon souhaite rajouter sur notre agenda.
On peut aussi demander ce que lapplication quon lance nous renvoie un rsul-
tat comme pour par exemple rcuprer les coordonnes dun contact en lanant
lapplication Rpertoire.
Des applications tiers peuvent aussi lancer notre application. Afin de grer ces
accs on peut dfinir des filtres dintention et dfinir comment rpondre ces
intentions.
Pour plus dinformation sur les interactions entre les applications consultez [5].

Changement de langue
Rendre votre application multilingue est trs simple si vous avez dfini tous vos
textes dans strings.xml. Il suffit de dfinir un strings.xml pour chaque langue que
vous voulez supporter et les placer dans des dossiers values nomms avec le code
de la langue en prfixe. Par exemple values-fr pour le franais, values-en pour
langlais, values-es pour lespagnol, etc.
Android slectionnera les ressources appropries en fonction de la langue que luti-
lisateur a dfinie pour son appareil.
. Crez un dossier values-en dans le dossier res
. Copier le fichier strings.xml se trouvant dans le dossier values et placer la
copie dans values-en.
. Dans ce nouveau fichier traduisez le texte vers langlais
. Chargez lapplication. Changez la Locale de lappareil et lancer lapplica-
tion : Lapplication passe sur la langue que vous venez de slectionner.
(La locale par dfaut est peut tre dj langlais, dans ce cas lapplication
saffichera directement en anglais)

Polytech Paris Sud Dima Rodriguez


Tutoriel Android 44

Si jamais vous choisissez une langue que votre application ne supporte pas, ce
seront les chaines de caractres dfinies par dfaut dans values/strings.xml qui
seront utilises.

Conclusion
Nous avons introduit quelques concepts de base de la programmation Android.
Avec les exemples relativement simples dtaills dans ce document nous avons
prsent les premires tapes de la cration dapplications.
Nous venons de vous accompagner dans vos premiers pas avec Android, main-
tenant cest vous de jouer !

Polytech Paris Sud Dima Rodriguez


Lexique
Activity Une activit reprsente un cran contenant une interface utilisateur.
Une application est compose dun ensemble dactivits. Les activits
peuvent interagir entre elles, intra-application ou inter-applications.
apk file Cest un fichier en format application package produit lissu de la
compilation dune application Android. Cest le fichier destin aux uti-
lisateurs. Ce fichier inclue le code de lapplication sous forme dun
executable DVM (.dex), les ressources multimdias, et le AndroidMa-
nifest.xml.

DVM Dalvik Virtual Machine. Cest une machine virtuelle disponible sur tout
appareil Android. Elle execute des fichiers en format .dex (format de
pseudo-code optimis)
Fragment Un fragment reprsente un comportement ou une portion de linterface
utilisateur dans une activit. On peut combiner plusieurs fragments
dans une mme activit pour crer une interface volets multiples et
rutiliser un fragment dans plusieurs activits.
Intent Cest un message qui permet dactiver un composant (une activit
par exemple). Cest un messager qui demande une action un autre
composant (de la mme application ou dune autre)
Layout Le layout dfinit la structure visuelle dune interface utilisateur. Les
lments dun layout peuvent tre dfinis soit dans un fichier XML
ou bien lexcution partir dinstructions dans le code. Lutilisation
XML permet de mieux sparer lapparence de lapplication dune part
et le code qui dfinit son comportement dautre part. Ceci permet de
sadapter plus facilement aux diffrentes cibles, il suffit de dfinir plu-
sieurs fichiers XML pour un mme code.

45
Tutoriel Android 46

Manifest Toute application Android doit possder un fichier XML nomm An-
droidManifest.xml. Ce fichier contient des informations essentielles sur
lapplication que le systme doit connaitre pour pouvoir la lancer. Ce
fichier dfinit le nom du package de lapplication, dcrit les compo-
sants de lapplication, dtermine le processus qui accueillera ces com-
posants, dclare les permissions dont lapplication a besoin et celles
que les autres doivent avoir pour interagir avec lapplication, dclare
la version Android minimale pour lapplication, et liste les bibliothques
dont lapplication a besoin.

Resources Ce sont les ressources en relation avec la prsentation de lapplication


(images, fichiers audio etc.). Pour chaque fichier de ressource quon
inclue dans le projet, un identifiant unique est cr pour rfrencer
cette ressource. Le fait davoir des ressources spares du code nous
donne la possibilit de proposer des versions diffrentes en fonction
de la configuration de la cible. En utilisant par exemple des images
diffrentes selon la rsolution de lappareil, une mise en forme adapte
en fonction de lorientation de laffichage (portrait ou paysage), des fi-
chiers de chaines de caractres en plusieurs langues pour que linterface
saffiche dans la langue de lutilisateur, etc.

Service Un service est un composant qui tourne en tche de fond, pour ef-
fectuer de longues oprations ou excuter des tches pour un autre
processus. Un service ne possde pas une interface utilisateur.

XML Extensible Markup Language (langage de balisage extensible), est un


langage informatique conu pour faciliter les changes de donnes entre
les systmes dinformations. Il dfinit un ensemble de rgles pour en-
coder les informations en format texte dune faon indpendante de
la machine. Il est bas sur des balises, cependant celles ci ne sont
pas dfinies par le standardard XML, cest lutilisateur/programmeur
qui dfinit ses propres balises. Le langage ne fait que dfinir les rgles
decriture.

Polytech Paris Sud Dima Rodriguez


Annexes

La classe R
La classe R est une classe gnre et mise jour automatiquement par Android
Studio. Elle se trouve dans un sous dossier de app\build\generated mais qui
napparait pas dans larborescence de lIDE. Ce fichier R.java dfinit une classe R
dans laquelle sont dfinis les identifiants des ressources de lapplication. A chaque
fois que vous rajoutez une ressource votre application un identifiant est g-
nr automatiquement dans cette classe vous permettant par la suite de pouvoir
le rfrencer pour lutiliser dans votre code. A lintrieur de classe R sont dfinies
plusieurs classes, dites niches 1 , telles que string, drawable, layout, menu,
id, etc. Dans notre cas toutes les classes niches dans R sont publiques, donc ac-
cessibles depuis lextrieur, mais comme elles sont membres de la classe R, pour
y accder, il faut passer par R. On utilisera des notations telles que R.string
puisque ces classes sont statiques. Les identifiants sont gnrs automatiquement
dans la classe R au moment o on les cre. Quand, par exemple nous avons
cr un champ de saisie avec comme identifiant chp_saisie, un attribut constant
public static final chp_saisie a t dfini automatiquement dans la
classe id et une valeur lui a t attribue. Cest un numro unique qui identifie
llment EditText que avons rajout. Cet identifiant nous permettra de mani-
puler llment partir du code avecR.id.chp_saisie. De mme, un attribut
constant nomm str_chp_saisie a t gnr dans la classe string. Il fait
rfrence la chaine de caractre et nous permettra de lutiliser dans le code avec
R.string.str_chp_saisie.

1. Une classe niche est membre de la classe qui la contient. On a recours ce genre de classe
en gnral lorsquon veut dfinir une classe qui nest utilise qu lintrieur dune autre classe.
Si on la dclare prive elle ne sera visible qua lintrieur de la classe qui la dfinie. Par ailleurs
cette dernire peut galement accder aux attributs privs de la classe niche. Cest une faon
damliorer la lisibilit du code en regroupant les fonctionnalits qui vont ensemble.

47
Tutoriel Android 48

Explication du code gnr par dfaut pour la


classe Principale
/*nom du package que nous avons dfini*/
package android.polytech.monappli;

/******************************************************************/
/*importation des classes utilises dans le code*/
/******************************************************************/
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.graphics.drawable.AnimationDrawable;
import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.View;
import android.view.Menu;
import android.view.MenuItem;

/******************************************************************/
/*Dfinition de la classe Principale qui hrite de AppCompatActivity*/
/******************************************************************/
public class Principale extends AppCompatActivity {
/*redfinition de la mthode onCreate() hrite de AppCompatActivity.
Elle prend en paramtre un objet de type Bundle. La classe Bundle
dfinit un type dobjet pouvant contenir un ensemble de donnes,
et qui est destin changer des donnes entre les activits. La
mthode onCreate() est appele une fois par le systme au premier
lancement de lactivit*/

protected void onCreate(Bundle savedInstanceState) {


/* largument savedInstanceState permet au systme de passer l
activit letat dans lequel elle tait la fin de sa dernire
exectution. En effet quand on arrte une activit le systme
appelle une certaine mthode ( onSaveInstanceState() ) dans
laquelle on peut sauvegarder certaines informations concernant l
etat de notre activit pour les rcuprer au moment o on la
relance. On pourrait par exemple sauvegarder le texte qui a t

Polytech Paris Sud Dima Rodriguez


Tutoriel Android 49

tap lexcution prcdente, ou bien la position dun scroll, ou


autre, pour les remettre quand on redmarre lactivit.*/

/*appel de onCreate() de la classe mre*/


super.onCreate(savedInstanceState);

/*avec setContentView() on dfinit le View que contiendra (affichera)


notre activit. Ici cest le layout activite_principale (identifi
par R.layout.activite_principale)*/
setContentView(R.layout.activite_principale);
/*Dfinition de la barre daction. On commence par rcuprer la barre
doutils dfinie par lidentifiant R.id.toolbar, ensuite avec l
appel setSupportActionBar() on dfinit cette barre doutils
comme tant la barre daction de lactivit*/
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
/*Dfinition du bouton flottant. On commence par rcuprer le
composant identifi par R.id.fab. */
FloatingActionButton fab = (FloatingActionButton) findViewById
(R.id.fab);
/*on dfinit une classe anonyme qui implmente linterface View.
OnClickListener. Pour cette classe on dfinit une mthode onClick
() On cre un objet de cette classe anonyme et on le passe en
paramtre setOnClickListener() du bouton flottant. Ainsi ce
nouvel objet de la classe anonyme coutera les vnnements sur le
bouton flottant et ds quil y a un appui sur ce bouton la mthode
onClick() dfinie ici sera appele */
fab.setOnClickListener(new View.OnClickListener() {
/*le paramtre view contiendra lobjet qui a dclanch lvnnement ,
ce sera le bouton flottant ici*/
public void onClick(View view) {
/*La classe Snackbar dfinit un popup en bas de lcran quon utilise
pour afficher un message temporaire qui disparaitra
automatiquement aprs un certain timeout. La mthode make de cette
classe construit un objet Snackbar. Ici le Sncakbar cr s
attache au parent du view pass en paramtre, affiche le message
pass en deuxime argument et reste affich pendant une dure
dfinie par la constante LENGTH_LONG de la classe Snackbar */
/*la mthode make() renvoie un objet de type Snackbar pour lequel on
invoque la mthode setAction(). Celle ci nous permet de dfinir un
callback pour laction sur le Snackbar, ici on nen dfinit aucun
(null). setAction() renvoie son tour lobjet Snackbar pour
lequel on invoque show() pour le faire apparaitre*/

Polytech Paris Sud Dima Rodriguez


Tutoriel Android 50

Snackbar.make(view, "Replace with your own action",


Snackbar.LENGTH_LONG).setAction("Action", null).show()
;}
});
}

/*La mthode onCreateOptionsMenu() est appele au moment de la


cration de la barre daction. Le systme lui passe un objet Menu
en paramtre, quon populera dans la mthode: Cest sur cet objet
quon rajoutera les lments du menu */
public boolean onCreateOptionsMenu(Menu menu) {
/*getMenuInflater() renvoie un objet de type MenuInflater. Cest une
classe qui est capable de crer un objet menu partir dun
fichier xml, et ce grace la mthode inflate(). Il suffit de lui
donner lidentifiant du menu xml (menu_principale.xml) et lobjet
de type Menu dans lequel on veut crer les items du menu*/
getMenuInflater().inflate(R.menu.menu_principale, menu);
/*il faut renvoyer true pour que le menu saffiche*/
return true;
}

/*mthode appele lorsquun item du menu est slectionn*/


public boolean onOptionsItemSelected(MenuItem item) {
/*lappui sur le bouton de retour est automatiquement trait si on
dfini une activit parent dans AndroidManifest.xml, on na pas
le traiter ici*/

/*on rcupre lidentifiant de litem sur lequel laction a t faite


*/
int id = item.getItemId();
if (id == R.id.action_settings) {
/*laction settings a t slectionne. Ici on ne fait rien*/
return true;
/*la mthode renvoie true pour indiquer quelle a trait laction
*/
}
/*si on ne traite pas laction, on demande la classe mre de le
faire en invoquant sa mthode onOptionsItemSelected(). Si la
classe mre ne traite pas laction elle renverra false */
return super.onOptionsItemSelected(item);
}

Polytech Paris Sud Dima Rodriguez


Tutoriel Android 51

Cycle de vie dune activit


Toute activit passe par plusieurs tats durant son cycle de vie, il est important
de connaitre ce cycle ainsi que les mthodes qui sont appeles chaque fois que
lapplication bascule dun tat vers lautre. Le diagramme de la figure 3.1 rsume le
cycle de vie dune activit. Vous trouverez une explication dtailles des diffrents
tats et mthodes ici et l.

Polytech Paris Sud Dima Rodriguez


Tutoriel Android 52

Figure 3.1 Cycle de vie dune activit


[1]

Polytech Paris Sud Dima Rodriguez


Bibliographie
[1] http ://developer.android.com/reference
[2] Wallace Jackson, Learn Android App Development, Apress (Springer Verlag),
May 2013
[3] https ://developer.android.com/training/multiple-threads/ communicate-
ui.html
[4] Chris Haseman, Android Essentials, Apress, July 2008
[5] https ://developer.android.com/training/basics/intents/index.html

53