554364-developpement-d-applications-pour-terminaux-android.pdf

90
Développement d'applications pour terminaux Android Par DakuTenshi et Hilaia www.siteduzero.com Dernière mise à jour le 15/10/2011

Upload: essafi-ennaceur

Post on 17-Feb-2015

36 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: 554364-developpement-d-applications-pour-terminaux-android.pdf

Développementd'applications pourterminaux Android

Par DakuTenshi et Hilaia

www.siteduzero.com

Dernière mise à jour le 15/10/2011

Page 2: 554364-developpement-d-applications-pour-terminaux-android.pdf

Sommaire

1Sommaire ........................................................................................................................................... 1Informations sur le tutoriel ................................................................................................................... 3Développement d'applications pour terminaux Android ...................................................................... 3Informations sur le tutoriel ................................................................................................................................................. 4Partie 1 : Les bases indispensables à toutes applications .................................................................. 4L'univers Android ............................................................................................................................................................... 4La création d'Android .................................................................................................................................................................................................. 7La philosophie et les avantages d'Android .................................................................................................................................................................. 7Les difficultés du développement pour des systèmes embarqués .............................................................................................................................. 8Confectionnons-nous un environnement de développement ........................................................................................... 8Conditions initiales ......................................................................................................................................................................................................

10Le JDK ....................................................................................................................................................................................................................... 10SDK Android .............................................................................................................................................................................................................. 13Eclipse ....................................................................................................................................................................................................................... 15L'Android Virtual Device ............................................................................................................................................................................................ 18Test et configuration .................................................................................................................................................................................................. 24Configuration du vrai terminal ................................................................................................................................................................................... 24Télécharger le driver ................................................................................................................................................................................................. 24Configuration du terminal .......................................................................................................................................................................................... 24Et après ? ..................................................................................................................................................................................................................

24Première application, celle qui vous rapportera des millions .......................................................................................... 24Activité et vue ............................................................................................................................................................................................................ 25Qu'est-ce qu'une activité ? ........................................................................................................................................................................................ 25États d'une activité .................................................................................................................................................................................................... 26Cycle de vie d'une activité ......................................................................................................................................................................................... 27Création d'un projet ................................................................................................................................................................................................... 30Un non-"Hello world!" ................................................................................................................................................................................................ 31Package .................................................................................................................................................................................................................... 31Import ........................................................................................................................................................................................................................ 32Class ......................................................................................................................................................................................................................... 32onCreate .................................................................................................................................................................................................................... 32Super ! ....................................................................................................................................................................................................................... 32setContentView ......................................................................................................................................................................................................... 33Lancement de l'application ........................................................................................................................................................................................

35Les ressources (généralités) ........................................................................................................................................... 37Le format XML ........................................................................................................................................................................................................... 38Les différents types de ressources ........................................................................................................................................................................... 40L'organisation ............................................................................................................................................................................................................ 42Exemples et règles à suivre ...................................................................................................................................................................................... 42Mes recommandations .............................................................................................................................................................................................. 43Ajouter un fichier avec Eclipse .................................................................................................................................................................................. 45Petit exercice ............................................................................................................................................................................................................. 46Récupérer une ressource .......................................................................................................................................................................................... 46La classe R ............................................................................................................................................................................................................... 48Application ................................................................................................................................................................................................................. 49Application .................................................................................................................................................................................................................

49Les ressources (l'interface graphique - composants principaux) .................................................................................... 49L'interface d'Eclipse ................................................................................................................................................................................................... 51Règles générales sur les vues .................................................................................................................................................................................. 52Différenciation entre un layout et un widget .............................................................................................................................................................. 52Attributs en commun ................................................................................................................................................................................................. 53Identification .............................................................................................................................................................................................................. 57Les widgets les plus simples ..................................................................................................................................................................................... 57Application de calcul de l'IMC (partie 1) .................................................................................................................................................................... 60Les évènements ........................................................................................................................................................................................................ 61Par héritage ............................................................................................................................................................................................................... 62Par un attribut ............................................................................................................................................................................................................ 63Petit exercice ............................................................................................................................................................................................................. 64Application de calcul de l'IMC (partie 2) .................................................................................................................................................................... 66Les layouts (gabarits) ................................................................................................................................................................................................ 67LinearLayout .............................................................................................................................................................................................................. 69Application de calcul de l'IMC (partie 3.1) ................................................................................................................................................................. 72RelativeLayout .......................................................................................................................................................................................................... 72Application de calcul de l'IMC (partie 3.2) ................................................................................................................................................................. 73TableLayout ............................................................................................................................................................................................................... 74Application de calcul de l'IMC (partie 3.3) .................................................................................................................................................................

Sommaire 1/89

www.siteduzero.com

Page 3: 554364-developpement-d-applications-pour-terminaux-android.pdf

75FrameLayout .............................................................................................................................................................................................................

76Partie 2 : Annexes ............................................................................................................................. 77L'architecture d'Android ................................................................................................................................................... 77Le noyau Linux .......................................................................................................................................................................................................... 79Les bibliothèques pour Android ................................................................................................................................................................................. 79Le moteur d'exécution Android .................................................................................................................................................................................. 82Les frameworks pour les applications ....................................................................................................................................................................... 82Les applications ........................................................................................................................................................................................................

83Attributs et méthodes des vues ....................................................................................................................................... 83TextView .................................................................................................................................................................................................................... 85EditText ..................................................................................................................................................................................................................... 86CheckBox .................................................................................................................................................................................................................. 88RadioGroup ............................................................................................................................................................................................................... 88RelativeLayout ..........................................................................................................................................................................................................

Sommaire 2/89

www.siteduzero.com

Page 4: 554364-developpement-d-applications-pour-terminaux-android.pdf

Informations sur le tutoriel

Auteur :

Frédéric Espiau (DakuTenshi)

Difficulté : Temps d'étude estimé : 1 mois Licence :

Développement d'applications pour terminaux Android

Le tutoriel que vous êtes en train de lire est en bêta-test. Son auteur souhaite que vous lui fassiez part de voscommentaires pour l'aider à l'améliorer avant sa publication officielle. Notez que le contenu n'a pas été validé parl'équipe éditoriale du Site du Zéro.

Bonjour à tous et bienvenue dans le monde merveilleux dudéveloppement pour terminaux utilisant le système d'exploitation mobileAndroid !

Android est certainement la boite àoutils, le couteau suisse high-techle plus répandu et complet que jeconnaisse. J'imagine ne pas être leseul à m'intéresser à cetenvironnement de développement,qui offre des possibilités tellementalléchantes ! Pensez à lalocalisation GPS, au tactile, auxinteractions avec les réseauxsociaux, au multimédia et àl'appareil photo par exemple ! Ilest tout adapté pour n'importe quisouhaite se lancer dans ledéveloppement mobile à peu de frais. Android est tout particulièrement facile à manipuler grâce à Java et aux nombreuxFrameworks (j'explique ce terme plus loin si vous en ignorez le sens) disponibles, puis il permet de mettre à disposition desutilisateurs les applications au travers de l'Android Market, procurant ainsi une visibilité immédiate.

Donc si j'ai bien compris, je peux m'initier à la programmation Android sans rien savoir à l'origine ? En partant dezéro ?

Et bien non ! Tout vous enseigner depuis le début serait redondant avec d'autres tutoriels qui sont déjà présents sur ce site.

Ainsi, pour pouvoir prétendre au développement Android, vous devez respecter les conditions suivantes :

Savoir développer en Java (pour cela, pour pouvez consulter la première partie du tutoriel de cysboy sur le sujet voireencore mieux, acheter le livre de la collection Le Livre Du Zéro du même auteur ).Dans une moindre mesure, il serait intéressant que vous sachiez effectuer certaines requêtes SQL de base. Il existe untutoriel qui aborde les bases du SQL sous MySQL que vous trouverez ici, malheureusement le contexte de ce tutorielest totalement différent de celui utilisé pour le développement Android.Je ferai bien entendu en sorte que ceux qui ignorent totalement ce langage ne soient pas complètement perdus, maissachez tout de même que la connaissance du SQL est de manière générale difficilement contournable dans le monde dela programmation.Être un minimum autonome en informatique. Par exemple, je ne vous expliquerai pas comment installer Eclipse étapepar étape .

Une chose vous sautera peut-être aux yeux, mais je ne vous demande pas de posséder un terminal (téléphone, ardoise,lecteur MP4, ...) sous Android. Ce n'est pas une erreur, il est tout à fait possible de développer, tester et publier ses applications sans posséder cetype de matériel. Cependant, sachez que rien ne remplacera jamais un vrai terminal sous Android pour des fins detest.

Ce tutoriel débutera en douceur et vous présentera d'abord les bases essentielles pour le développement Android afin depouvoir effectuer des applications simples et compatibles avec tous les types de terminaux. On abordera ensuite des notionsplus avancées afin d'exploiter les multiples facettes que présente Android.

Développement d'applications pour terminaux Android 3/89

www.siteduzero.com

Page 5: 554364-developpement-d-applications-pour-terminaux-android.pdf

Partie 1 : Les bases indispensables à toutes applications

L'univers AndroidJe souhaite tout d'abord vous présenter ce que j'appelle l'univers Android. Android est un support formidable, autant pour lesutilisateurs, que pour les développeurs et les constructeurs. Son développement part d'une idée de base simple et très vite il asu devenir un système capable de s'imposer dans un certain nombre de domaines dans le monde du mobile. Il y a une histoireet une philosophie particulière derrière Android que je compte bien vous communiquer à travers ce chapitre.

Ce chapitre contient du vocabulaire technique. Ce n'est pas parce que vous êtes un zéro que vous devez le rester .

Le fait étant que l'on utilise des mots particuliers dans l'univers de l'informatique, et que si vous souhaitezcomprendre tous les documents techniques que vous trouverez, vous aurez besoin de maîtriser tout ce vocabulaire. Jefais en sorte d'expliquer tout ce qui me semble un peu compliqué à comprendre. N'hésitez pas à vous plaindre ou à mesuggérer d'éventuelles améliorations dans les commentaires, surtout s'il y a quoi que ce soit qui vous semble flouvoire carrément obscur !

Partie 1 : Les bases indispensables à toutes applications 4/89

www.siteduzero.com

Page 6: 554364-developpement-d-applications-pour-terminaux-android.pdf

La création d'AndroidOn associe tous le nom d'Android à Google, et pourtant il faut savoir que la multinationale est loin d'être la seule à avoir mis lamain à la pâte pour concevoir ce système. Preuve étant, Android était le nom d'une petite entreprise créée en 2003 puisrachetée par Google en 2005 qui avait à l'époque la ferme intention de s'introduire sur le marché des produits mobiles. Al'origine, l'entreprise Android essayait de développer un système d'exploitation plus intelligent, qui ne se contentait pas desfonctions basiques que sont les SMS et les appels, et qui se devait d'interagir avec l'environnement de l'utilisateur (notammentavec sa position). C'est pourquoi, contrairement à une croyance populaire, on peut affirmer qu'Android n'est pas une réponsede Google à l'iPhone d'Apple puisque l'existence de ce dernier n'a été révélée que 2 ans plus tard.

C'est en 2007 que la situation prit une autre tournure. A cette époque, chaque constructeur équipait ses téléphones de sonsystème propriétaire, c'est pourquoi il était impossible de développer facilement une application qui s'adaptait à tous lessystèmes, puisqu'ils étaient tous très différents. Un développeur était plutôt spécialisé dans un système particulier et il devaitse contenter de langages de bas niveaux comme le C ou le C++. De plus, les constructeurs faisaient en sorte de livrer desbibliothèques de développement très réduites de manière à conserver pour eux leurs secrets de fabrication. En janvier 2007,Apple dévoilait l'iPhone, un téléphone tout simplement révolutionnaire pour l'époque. L'annonce est un désastre pour lesautres constructeurs, qui doivent s'aligner sur cette nouvelle concurrence. Le problème étant que pour atteindre le niveau fixépar Apple, il aurait fallu des années de recherche pour chaque développeur...

C'est pourquoi est créée en Novembre de l'année 2007, l'Open Handset Alliance (que j'appellerai désormais par son sigle OHA),et qui comptait à sa création 35 entreprises évoluant dans l'univers mobile, dont Google. Cette alliance a pour but dedévelopper un environnement open-source (c'est-à-dire dont les sources sont disponibles librement sur internet) pourl'exploitation sur mobile et ainsi concurrencer les systèmes propriétaires, par exemple Windows Mobile et iPhone OS. Androidest le logiciel vedette de cette alliance.

Il existe à l'heure actuelle plus de 80 membres dans l'OHA.

Android est aujourd'hui, en août 2011, le système d'exploitation pour smartphones et ardoises le plus utilisé.

Et le futur d'Android?

Et bien début mai 2011, on apprend qu'Android va se lancer dans le domaine de la domotique, c'est-à-dire contrôler etautomatiser sa maison à travers des machines et des systèmes. Imaginez-vous allumer votre téléviseur à distance grâce à votretéléphone puis lancer en même temps le micro-onde pour qu'il chauffe le pop-corn.

Les prévisions en ce qui concerne la distribution d'Android sur le marché sont très bonnes avec de plus en plus de machines

Partie 1 : Les bases indispensables à toutes applications 5/89

www.siteduzero.com

Page 7: 554364-developpement-d-applications-pour-terminaux-android.pdf

qui s'équipent de ce système. Bientôt, il se trouvera dans les téléviseurs (vous avez entendu parler de Google TV peut-être ?) etles voitures. Android sera partout. Ce serait dommage de ne pas faire partie de ça, hein ?

Partie 1 : Les bases indispensables à toutes applications 6/89

www.siteduzero.com

Page 8: 554364-developpement-d-applications-pour-terminaux-android.pdf

La philosophie et les avantages d'AndroidLe contrat de licence pour Android respecte l’idéologie open-source, c'est-à-dire que vous pouvez à tout momenttélécharger les sources et les modifier selon vos goûts ! Cependant je ne vous le recommande vraiment pas à moins quevous sachiez ce que vous faites... Notez au passage qu'Android utilise des bibliothèques open-sources puissantescomme par exemple SQLite pour les bases de données et OpenGL pour la gestion d'images 2D et 3D.

Android est gratuit, autant pour vous, que pour les constructeurs. Vous n'aurez pas à payer un kopeck si vous souhaitezvendre un téléphone qui exploite Android, SAUF si vous souhaitez qu'il puisse utiliser légalement les Google Apps,tels que Google Maps ou l'Android Market par exemple.

Toutes les API mises à disposition facilitent et accélèrent grandement le travail (pensez aussi aux futurs API pour lesécrans 3D par exemple). Ces APIs sont très complètes et très faciles d'accès. De manière un peu caricaturale, on peutdire que vous pouvez envoyer un SMS en seulement deux lignes de code (concrètement, il y a un peu d'enrobageautour de ce code).

Une API, ou Interface de Programmation en français, est un ensemble de règles et de spécifications quepeuvent emprunter des programmes pour discuter ensemble. C'est une interface entre plusieurs logiciels qui leur permet de communiquer. Dans le cas du Google API, ilpermet de communiquer avec Google Maps en particulier.

L'Android Market est un endroit immense avec beaucoup de visites et de possibilité pour améliorer la visibilité d'uneapplication. Poster son application ne coûte que 25$ (soit 17€, merci le taux de change !) et elle peut devenir très viterentable si vous développez quelque chose d'original ou d'utile !

Le système est extrêmement portable, il s'adapte à beaucoup de structures, toutes énormément différentes. Lessmartphones, les ardoises, la présence ou l'absence de clavier ou de trackball, différents processeurs, différents écrans...On trouve même des micro-ondes qui fonctionnent à l'aide d'Android ! Non seulement c'est un plaisir d'avoir autant de possibilités, mais en plus Android est construit de manière à faciliter ledéveloppement et la distribution en fonction des composants en présence dans le terminal (si votre applicationnécessite d'utiliser le Bluetooth, seuls les terminaux équipés de Bluetooth pourront la voir sur le Market).

L'architecture d'Android est inspirée par les applications composites, et encourage leur développement. Cesapplications se trouvent essentiellement sur internet et leur principe est que vous pouvez combiner plusieurscomposants totalement différents pour obtenir un résultat surpuissant. Par exemple, si on combine l'appareil photoavec le GPS, on peut poster les coordonnées GPS des photos prises.

Partie 1 : Les bases indispensables à toutes applications 7/89

www.siteduzero.com

Page 9: 554364-developpement-d-applications-pour-terminaux-android.pdf

Les difficultés du développement pour des systèmes embarquésAïe, voilà un sujet qui en dégoûtera plus d'un ! Car oui, on ne développe pas pour un smartphone comme on développe pourvotre PC de bureau par exemple.

Prenons un cas concret: vous avez combien de RAM sur votre ordinateur là maintenant? Moi j'ai 4 Go, ce qui me permet defaire tout ce que veux, et encore, je ne vais peut-être pas lancer une compression vidéo (ce qui demande beaucoup de RAM)tout en jouant à un jeu vidéo. Sur mon téléphone, le HTC Desire, j'ai... 512 Mo de RAM. C'est 8 fois moins. Je vous laisseimaginez que ça laisse beaucoup moins de liberté. C'est pourquoi votre périphérique portable est dit limité, il doit supporterdes contraintes qui font doucement sourire votre ordinateur.

Voici les principales contraintes à prendre en compte quand on développe pour un environnement mobile:

Il faut pouvoir interagir avec un système complet sans l'interrompre. Android fait des choses pendant que votreapplication est utilisée, il reçoit des SMS et des appels entre autres. Il faut respecter une certaine priorité dansl'exécution des tâches. Sincèrement, vous allez bloquer les appels de l'utilisateur pour qu'il puisse terminer sa partie devotre jeu de Sodoku ?

La taille de l'écran est petite voire minuscule, il faut envisager des solutions pour que tous les utilisateurs puissent lireles informations que vous mettez à leur disposition. Il faut adapter l'interface homme-machine à ce format, rivaliserd'ingéniosité pour fournir un contenu fonctionnel et efficace.

La taille du clavier est elle aussi réduite, attendez-vous à plus de fautes de frappe que pour une application qui estmanipulée avec un clavier standard. Par exemple, un module qui fait de l’auto-complétion. S'il doit fouiller dans une grosse base de données, l'applicationest peut-être déjà très lente, mais si en plus à chaque frappe il faut renouveler les requêtes de récupération etd'affichage, avec un taux de fautes de frappe si élevé, l'utilisateur a vite fait de supprimer votre application quil'énervera de par sa lenteur.

Autre chose qui est directement liée, les interfaces tactiles sont peu pratiques en cas d'utilisation avec un stylet et/oupeu précises en cas d'utilisation avec les doigts, d'où des contraintes liées à la programmation évènementielle plusrigides. En effet, il est possible que l'utilisateur se trompe souvent de boutons. Très souvent s'il a de gros doigts.

Les conséquences de telles négligences peuvent être terribles pour l'utilisateur. Saturez le processeur et il ne pourra plus rienfaire excepté redémarrer, il ne pourra même plus recevoir d'appels, ce qui est une énorme bêtise de votre part. Faire crasher uneapplication ne fera en général pas complètement crasher le système, cependant il pourrait bien s'interrompre quelques temps etirriter profondément l'utilisateur.

Il faut bien comprendre que dans le paradigme de la programmation classique vous êtes dans votre propre monde et vousn'avez vraiment pas grand chose à faire du reste de l'univers dans lequel vous évoluez, alors que là vous faites partie d'unsystème fragile qui évolue sans anicroche tant que vous n'intervenez pas. Votre but est de fournir des fonctionnalités de plus àce système et aussi à faire en sorte de ne pas le perturber de manière négative.

Bon je réalise à la relecture que je suis très alarmiste, Android a déjà anticipé la plupart des âneries que vouscommettrez et a pris des dispositions pour éviter des catastrophes qui conduiront au blocage total du téléphone. Jevous invite à lire l'annexe sur l'architecture d'Android pour comprendre un peu pourquoi il faut être un barbare pourvraiment réussir à saturer le système.

J'espère vous avoir bien fait comprendre la philosophie d'Android et les contraintes du développement pour mobiles.

Autant ce chapitre n'est pas fondamental et vous l'oublierez sûrement comme votre premier cours en maternelle, autant jeressens le besoin de vous communiquer de genre d'informations dites superflues, mais qui vous permettront si vous le désirezde comprends le toute la logique qui entoure le développement sous Android .

Confectionnons-nous un environnement dedéveloppement

Avant de pouvoir rentrer dans le vif du sujet, nous allons vérifier que votre ordinateur peut supporter la charge dudéveloppement pour Android puis le cas échéant, on installera tous les programmes et composants nécessaires. Encore mieux,ceux qui ont un terminal sous Android pourront le configurer afin de pouvoir travailler directement avec.

Partie 1 : Les bases indispensables à toutes applications 8/89

www.siteduzero.com

Page 10: 554364-developpement-d-applications-pour-terminaux-android.pdf

Conditions initialesDe manière générale, n'importe quel matériel permet de développer sur Android du moment que vous utilisez Windows, MacOS X ou une distribution Linux. Il y a bien sûr certaines limites à ne pas franchir.

Voyons si votre système d'exploitation est suffisant pour vous mettre au travail.

Pour un environnement Windows, vous aurez besoin de Windows XP au minimum. Sont donc tolérés XP, Vista et 7.Sous Mac, il vous faudra Mac OS 10.5.8 ou plus récent et un processeur x86.Sous GNU/Linux, je ne peux que recommander une distribution Ubuntu plus récente que la 8.04. Enfin de manièregénérale, n'importe quelle distribution convient à partir du moment où votre bibliothèque GNU C (glibc) est au moinsà la version 2.7 .

Comme indiqué dans l'introduction du tutoriel, avant d'entamer le cours vous devez maîtriser les bases del'informatique, je ne prendrai pas de temps pour vous aider à chaque étape basique ! Tout ce que je présenterai sera dans un environnement Windows 7.

Partie 1 : Les bases indispensables à toutes applications 9/89

www.siteduzero.com

Page 11: 554364-developpement-d-applications-pour-terminaux-android.pdf

Le JDKEn tant que développeur Java vous avez certainement déjà installé le JDK, cependant on ne sait jamais ! Vous sortez peut-êtred'un formatage ou quoi que ce soit, alors je vais vous rappeler comment l'installer. En revanche, si vous l'avez bien installé etque vous êtes à la dernière version, ne perdez pas votre temps et filez directement à la prochaine section !

Un petit rappel technique ne fait de mal à personne. Il existe deux plateformes en Java, le JRE (Java RuntimeEnvironment) et le JDK ( Java Development Kit). Le JRE contient la JVM (Java Virtual Machine), les bibliothèquesde base du langage ainsi que tous les composants nécessaires au lancement d'applications ou d'applets Java. En sorte,c'est l'ensemble d'outils qui vous permettra d’exécuter les applications Java. Cependant nous sommes desdéveloppeurs, nous avons besoin du JDK car il contient le JRE (afin d’exécuter les applications Java), mais aussi unensemble d'outils pour compiler et débugger votre code ! Vous trouverez un peu plus de détails sur la compilationdans l'annexe sur l'architecture d'Android.

Rendez-vous ici et cliquez sur « Download » à côté de « Java SE 6 Update xx » (on va ignorer « Java SE 7 » pour lemoment).

On vous demande ensuite d'accepter (« Accept License Agreement ») ou de décliner (« Decline License Agreement ») uncontrat de licence, vous devez accepter ce contrat avant de continuer.

Choisissez ensuite la version adaptée à votre ordinateur. Installez le tout là où vous le désirez. Vous aurez besoin de 200 Mode libre sur le disque ciblé.

Et si je veux utiliser un compilateur java alternatif?

Tout ce que je sais, c'est que « OpenJDK » fonctionne correctement. Après, je n'ai pas eu d'échos positifs pour les autrescompilateurs.

Partie 1 : Les bases indispensables à toutes applications 10/89

www.siteduzero.com

Page 12: 554364-developpement-d-applications-pour-terminaux-android.pdf

SDK AndroidC'est quoi un SDK?

Un SDK, qui est traduit en Kit de Développement dans notre langue, est un ensemble d'outils que met à disposition un éditeurafin de vous permettre de développer des applications pour un environnement précis. On entend par exemple beaucoup parlerde SDK dans le domaine des jeux vidéo. Ces SDK vous permettent de développer des modifications pour un jeu (rajouter desarmes, changer les règles du jeu, permettre au joueur de vivre une nouvelle histoire, etc). Le SDK Android permet donc dedévelopper des applications pour Android et uniquement pour Android.

Pour se le procurer, rendez-vous ici et sélectionnez la version dont vous avez besoin. Il existe des instructions en anglaisplacées en-dessous des liens, ne vous y intéressez pas, je vous expliquerai la démarche moi-même. Au premier lancement, onvous proposera de télécharger plusieurs paquets. Voici ceux que j'ai retenus (rien ne vous oblige à strictement suivre cettedécision, vous serez dans la possibilité de faire vos propres décisions une fois que vous aurez pris conscience de monexplication qui se situe juste en-dessous de l'image):

Pourquoi ceux-là et pas les autres?

Regardez bien le nom des paquets, vous trouverez qu'ils se ressemblent beaucoup, à l'exception près des nombres qui diffèrentd'une ligne à l'autre. Cette différence s'explique par le fait qu'il existe plusieurs versions de la plateforme Android qui ont étédéveloppées depuis sa sortie, et le SDK actuel permet de développer des applications qui fonctionneront sur la version 1.5 ettoutes les version qui lui ont succédée. A chacune de ces versions, on trouve un numéro API<x> associé, avec <x> quicommence à 3. J'ai choisi de délaisser les version précédent la version 2.1 (l'API 7), tout simplement parce qu'une application développéepour une version ne fonctionne pas automatiquement sur les versions précédentes d'Android, et si elle est développée pour2.1, elle fonctionnera sous 2.1, 2.2, 3.1... mais pas forcément pour 1.6 et 1.5 !

A l'heure actuelle, les API dont le numéro est supérieur ou égal à 11 sont destinées aux tablettes graphiques. Enthéorie, vous n'avez pas à vous en soucier, les applications développées avec les autres API fonctionneront. Enpratique, Android lancera un mode de compatibilité pour optimiser l'affichage pour les tablettes graphiques ainsiqu'améliorer les performances.

Vous penserez peut-être qu'il est injuste de laisser de côté les utilisateurs qui sont contraints d'utiliser encore ces anciennesversions, mais sachez qu'ils ne représentent que 5% du parc mondial des utilisateurs d'Android. De plus, les changements entrela version 1.6 et la version 2.1 sont trop importants pour être ignorés. Ainsi, toutes les applications que nous développeronsfonctionneront sous Android 2.1 minimum. On trouve aussi pour chaque SDK des échantillons de code, « samples », qui vousserons très utiles pour approfondir ou avoir un second regard à propos de certains aspects, ainsi qu'une API Google associée.

Partie 1 : Les bases indispensables à toutes applications 11/89

www.siteduzero.com

Page 13: 554364-developpement-d-applications-pour-terminaux-android.pdf

Dans un premier temps, vous pouvez ignorer ces API, mais sachez qu'on les utilisera par la suite.

Si vous avez bien lu, vous avez compris que vous pourriez très bien vous débrouiller avec uniquement le SDK pourla version 2.1 pour ce tutoriel, cependant j'ai supposé que vous seriez curieux ou assez motivé à l'issue de ce courspour avoir envie de continuer à développer sous Android et pourquoi pas développer pour des versions plusrécentes de l'API.Si vous souhaitez ne pas télécharger de SDK que vous n'êtes pas sûr d'utiliser, téléchargez uniquement l'API 7 etéventuellement l'API Google de la même version.

Les autres paquets ne sont pas indispensables pour ce cours.

Si vous installez tous ces paquets, vous aurez besoin de 1.8 Go sur le disque de destination. Et oui, Le téléchargement prendraun peu de temps.

Partie 1 : Les bases indispensables à toutes applications 12/89

www.siteduzero.com

Page 14: 554364-developpement-d-applications-pour-terminaux-android.pdf

EclipseAvant que les partisans d'un autre IDE ne s'emportent, je tiens à préciser que si j'ai sélectionné Eclipse, c'est tout simplementqu'il est tellement utilisé et indiqué pour le développement sur Android qu'il est cité sur le site officiel dédié audéveloppement sur Android.

Il n'est pas indispensable d'utiliser Eclipse, vous pouvez aussi très bien développer vos applications en ligne decommande... Vous pouvez aussi opter pour d'autres IDE comme IntelliJ IDEA par exemple, mais je ne l'ai jamais faitmoi-même. Il n'existe malheureusement pas énormément d'IDEs alternatifs. Ils ne sont pas forcément à la hauteurcomparés à ces deux monstres: soit ils ne peuvent pas développer pour Android, soit le module qui fait que vouspouvez développer est encore instable ou trop jeune que pour les concurrencer.

Cliquez ici pour choisir une version d'Eclipse à télécharger. J'ai personnellement opté pour « Eclipse IDE for JavaDevelopers » qui est le meilleur compromis entre contenu suffisant et taille du fichier à télécharger. Les autres versionsutilisables sont « Eclipse IDE for Java EE Developers » (je ne vous le recommande pas pour notre cours, il pèse plus lourd eton n'utilisera absolument aucune fonctionnalité de Java EE) et « Eclipse Classic » (qui lui aussi intègre des modules que nousn'utiliserons pas).

Il vous faudra 110 Mo sur le disque pour installer la version d'Eclipse que j'ai choisie.

L'installation d'Eclipse consiste en une simple extraction, vous n'aurez par conséquent aucun raccourci sur le bureau.Je me permets juste de vous conseiller d'en faire un, histoire de ne pas être embêté.

Maintenant qu'Eclipse est installé, lancez-le. Au premier démarrage il vous demandera de définir un « Workspace », unespace de travail, c'est-à-dire l'endroit où il créera les fichiers indispensables contenant les informations sur les projets.Sélectionnez l'emplacement que vous souhaitez. Vous avez maintenant un Eclipse prêt à fonctionner... mais pas pour ledéveloppement pour Android ! Pour cela, on va télécharger le plug-in (l'extension) « Android Development Tools » (quej'appellerai désormais « ADT »). Il vous aidera à créer des projets pour Android avec les fichiers de base, mais aussi à tester, àdébugger et à exporter votre projet en APK (pour pouvoir partager vos applications).

ADT n'est pas la seule extension qui permette de paramétrer Eclipse pour le développement Android, le MOTODEVStudio For Android est plus évolué sur certains points. Cependant je n'ai pas encore eu l'occasion de travailler avec,je ne peux donc pas vraiment vous indiquer s'il faut l'utiliser de préférence.

Allez dans « Help » puis dans « Install New Softwares... » (installer de nouveaux programmes). Au premier encart intitulé «Work with: », cliquez sur le bouton « Add... » qui se situe juste à côté. On va définir où télécharger ce nouveau programme.Dans l'encart « Name » écrivez par exemple « ADT » et dans location, copiez-collez l'adresse ci-dessous:

Citation

https://dl-ssl.google.com/android/eclipse/

Avec cette adresse, on indique à Eclipse qu'on désire télécharger de nouveaux logiciels qui se trouvent à cet emplacement,afin qu'Eclipse nous propose de les télécharger.

Partie 1 : Les bases indispensables à toutes applications 13/89

www.siteduzero.com

Page 15: 554364-developpement-d-applications-pour-terminaux-android.pdf

Cliquez sur « OK ».

Dans le grand champ central, vous verrez écrit « Pending... », ce qui signifie que vous devez patienter pendant qu'il chercheles fichiers disponibles à l'emplacement que vous avez précisé. Dès que « Developer Tools » apparaît à la place de «Pending... », développez le menu en cliquant sur le triangle à côté du carré de sélection et analysons les éléments proposés.

« Android DDMS » est l'« Android Dalvik Debug Monitor Server », il permet d’exécuter quelques fonctions pourvous aider à débugger votre application (simuler un appel ou une position géographique par exemple) et d'avoir accèsà d'autres informations utiles.L'ADT.« Android Hierarchy Viewer » qui permet d'optimiser et de débugger son interface graphique.« Android Traceview » qui permet d'optimiser et de débugger son application.

Sélectionnez tout et cliquez sur « Next », à nouveau sur « Next » à l'écran suivant puis finalement sur « I accept the terms ofthe license agreements » après avoir lu les différents contrats. Cliquez enfin sur « Finish ». L'ordinateur téléchargera puisinstallera les composants. Une fenêtre s'affichera pour vous dire qu'il n'arrive pas à savoir d'où viennent les programmestéléchargés et par conséquent qu'il n'est pas sûr qu'ils soient fonctionnels et qu'ils ne soient pas dangereux. Cependant, noussavons qu'ils sont sûrs et fonctionnels alors cliquez sur « OK ».

Partie 1 : Les bases indispensables à toutes applications 14/89

www.siteduzero.com

Page 16: 554364-developpement-d-applications-pour-terminaux-android.pdf

Une fois l'installation et le téléchargement terminés, il vous proposera de redémarrer l'application. Faites donc en cliquant sur« Restart Now ». Voilà, il ne vous reste plus qu'à indiquer à Eclipse où se trouve le SDK ! En effet, vous lui avez fourni lesmoyens d'utiliser le SDK, mais pas l'emplacement du SDK. Cliquez sur « Window » puis sur « Preferences » (dernier choix).Cliquez sur « Android » à gauche, puis sur « Browse... » pour sélectionner l'endroit où est installé le SDK. Une fois cela fait,vous aurez un écran de ce style-là :

C'est fait, Eclipse sait désormais où trouver le SDK. On n'est pas encore tout à fait prêt, il nous reste une dernière étape àaccomplir.

Partie 1 : Les bases indispensables à toutes applications 15/89

www.siteduzero.com

Page 17: 554364-developpement-d-applications-pour-terminaux-android.pdf

L'Android Virtual DeviceL'« Android Virtual Device », aussi appelé « AVD », est un émulateur de terminal sous Android, c'est-à-dire qu'il en simule lecomportement. C'est la raison pour laquelle vous n'avez pas besoin d'un terminal sous Android pour tester votre application !Lancez à nouveau Eclipse si vous l'avez fermé. Au cas où vous auriez encore l'écran d'accueil, cliquez sur la croix en haut àgauche pour le fermer. Vous aurez un aspect sensiblement identique à l'image ci-dessous. Repérez tout d'abord où se trouve labarre d'outils.

Cliquez sur l'icône qui représente la mascotte d'Android, « Bugdroid ».

Surprise ! Vous voici dans l'interface du SDK d'Android ! Cliquez sur « New... » pour ajouter un nouvel AVD.

Une fois sur deux, Eclipse me dit que je n'ai pas défini l'emplacement du SDK (« Location of the Android SDK hasnot been setup in the preferences. »). S'il vous le dit aussi, c'est que soit vous ne l'avez vraiment pas fait, auquel casvous devrez refaire l'opération précédente, soit Eclipse pipote un peu, auquel cas réappuyez sur le bouton jusqu'à cequ'il abdique.

Vous pouvez créer ici un AVD. Dans « Name », mettez un nom pour pouvoir distinguer votre AVD de ceux que vous créerezplus tard. J'ai choisi par exemple « Site_Du_Zero_2_1 », car certains caractères comme les accents et les espaces ne sont pasautorisés. Dans « Target », choisissez « Android 2.1-update1 - API Level 7 » puisque j'ai décidé que nous ferons notrepremière application sans le Google API et sans les fonctionnalités qu'apportent les versions suivantes d'Android.

Laissez les autres options à leur valeur par défaut, nous y reviendrons plus tard quand nous confectionnerons d'autres AVD.Cliquez enfin sur « Create AVD » et vous aurez une machine prête à l'emploi.

Partie 1 : Les bases indispensables à toutes applications 16/89

www.siteduzero.com

Page 18: 554364-developpement-d-applications-pour-terminaux-android.pdf

Partie 1 : Les bases indispensables à toutes applications 17/89

www.siteduzero.com

Page 19: 554364-developpement-d-applications-pour-terminaux-android.pdf

Test et configurationBien, maintenant que vous avez créé un AVD, on va pouvoir vérifier qu'il fonctionne bien.

Si vous êtes sorti du gestionnaire Android, retournez-y en cliquant sur l'icône « Bugdroid », comme nous l'avons faitauparavant. Vous aurez quelque chose de plus ou moins similaire à:

Vous y voyez l'AVD que nous venons tout juste de créer. Cliquez dessus pour déverrouiller le menu de droite. Étant donnéque je ne reviendrai pas sur ces options moi-même, je vais vous expliquer à quoi elles correspondent pour que vous puissiez yaccéder vous-même en cas de besoin. Les options du menu de droite sont les suivantes:

« Edit... » vous permet de changer les caractéristiques de l'AVD sélectionné.« Delete... » vous permet quant à lui de supprimer l'AVD sélectionné.« Repair... » ne vous sera peut-être jamais d'aucune utilité, il vous permet de réparer un AVD quand le gestionnairevous indique qu'il faut le faire. La documentation n'abonde pas à propos de ce bouton, je ne rentrerai pas dans le détailà ce sujet.« Details... » lancera une nouvelle fenêtre qui listera les caractéristiques de l'AVD sélectionné.Enfin « Start... » est le bouton qui nous intéresse maintenant, il vous permet de lancer l'AVD.

On cliquera donc sur le bouton « Start... ». Une nouvelle fenêtre se lancera qui devrait ressembler peu ou prou à:

Partie 1 : Les bases indispensables à toutes applications 18/89

www.siteduzero.com

Page 20: 554364-developpement-d-applications-pour-terminaux-android.pdf

Laissez les options vierges pour l'instant, on n'a absolument pas besoin de ce genre de détails. Cliquez juste sur « Launch ».En théorie, une nouvelle fenêtre se lancera et passera par deux écrans de chargement successifs.

puis

Partie 1 : Les bases indispensables à toutes applications 19/89

www.siteduzero.com

Page 21: 554364-developpement-d-applications-pour-terminaux-android.pdf

Enfin, votre terminal se lancera, voici la liste des boutons qui se trouvent dans le menu à droite et ce à quoi ils servent:

Partie 1 : Les bases indispensables à toutes applications 20/89

www.siteduzero.com

Page 22: 554364-developpement-d-applications-pour-terminaux-android.pdf

Mais ! L'émulateur n'est pas l'heure ! En plus c'est anglais, et moi et l'anglais ça fait... ben zéro.

En effet, les machines que vous achetez sont déjà configurées pour le pays dans lequel vous les avez acquises. Nous allonsdevoir configurer la machine pour qu'elle réponde à nos exigences. Vous pouvez manipuler la partie de gauche avec votresouris, ce qui simulera le tactile. Faites glisser le verrou sur la gauche pour déverrouiller la machine. Vous vous retrouverezsur l'accueil. Cliquez sur le bouton « MENU » à droite (au-dessus du clavier) pour ouvrir un petit menu en bas de l'écran degauche.

Partie 1 : Les bases indispensables à toutes applications 21/89

www.siteduzero.com

Page 23: 554364-developpement-d-applications-pour-terminaux-android.pdf

Cliquez sur l'option « Settings » pour ouvrir le menu de configuration d'Android. Vous pouvez y naviguer soit en faisantglisser avec la souris (un clic puis en laissant appuyer on dirige le curseur vers le haut ou vers le bas), soit avec la molette devotre souris. Si par mégarde vous entrez dans un menu non désiré, appuyez sur le bouton « Retour » présenté précédemment(une espèce de flèche qui effectue un demi-tour). On va sélectionner l'option « Language & keyboard » en cliquant dessus.C'est le menu qui vous permet de choisir dans quelle langue utiliser le terminal et quel type de clavier utiliser (par exemple,vous avez certainement un clavier dont les premières lettres forment le mot « AZERTY », c'est ce qu'on s'appelle un clavierAZERTY. Oui, oui, les informaticiens ont beaucoup d'imagination).

Puis, vous allez cliquer sur « Select locale ». Dans le prochain menu, il vous suffit de sélectionner la langue dans laquellevous préférez utiliser Android. J'ai personnellement choisi « Français (France) ». Voilà, un problème de réglé ! Maintenantj'utiliserai les noms français des menus pour vous orienter. Pour revenir en arrière, il faut appuyer sur le bouton « Retour » dumenu de droite.

Votre prochaine mission si vous l'acceptez sera de changer l'heure pour qu'elle s'adapte à la zone dans laquelle vous voustrouvez, et ce, par vous-même. En France nous vivons dans la zone GMT + 1. A l'heure où j'écris ce cours, nous sommes enheure d'été, il y a donc une heure encore à rajouter. Ainsi, si vous êtes en France, en Belgique ou au Luxembourg et en heured'été, vous devez sélectionner une zone à GMT + 2. Sinon GMT + 1 pour l'heure d'hiver. Le but est bien entendu de vouspermettre de découvrir le système par vous-même et de vérifier que vous avez bien compris comment vous déplacer dansl'environnement Android.

Secret (cliquez pour afficher)

Partie 1 : Les bases indispensables à toutes applications 22/89

www.siteduzero.com

Page 24: 554364-developpement-d-applications-pour-terminaux-android.pdf

Cliquez d'abord sur « Date & heure », désélectionnez « Automatique », puis cliquez sur « Définir fuseau horaire » etsélectionnez le fuseau qui vous concerne.

Très bien, votre terminal est maintenant bientôt complètement configuré, nous allons juste vérifier qu'il est apte à laprogrammation. Toujours dans le menu de configuration, allez chercher « Applications » et cliquez dessus. Cliquez ensuitesur « Développement » et vérifiez que tout est bien activé comme suit:

Vous l'aurez remarqué de vous-même, la machine est lourde, très lourde, autant dire tout de suite que c'est beaucoupmoins confortable à manipuler qu'un vrai terminal sous Android.

Si vous comptez faire immédiatement le prochain chapitre qui vous permettra de commencer - enfin - le développement, nequittez pas la machine. Dans le cas contraire, il vous suffit de rester appuyé sur le bouton « Verrouiller / Éteindre » puis devous laisser guider.

Partie 1 : Les bases indispensables à toutes applications 23/89

www.siteduzero.com

Page 25: 554364-developpement-d-applications-pour-terminaux-android.pdf

Configuration du vrai terminalMaintenant on va s'occuper de notre vrai outil, si vous en avez un !

Télécharger le driver

Tout d'abord, vous devez télécharger les drivers (pilotes informatiques, c'est-à-dire un fichier qui indique à votre ordinateurcomment utiliser un matériel) adaptés à votre terminal. Je peux vous donner la démarche à suivre pour certains terminaux,mais pas pour tous... En effet, chaque appareil a besoin de drivers adaptés, et ce sera donc à vous de les télécharger. Cependant,il existe des pilotes génériques qui peuvent fonctionner sur certains appareils. Je vous les ai fait télécharger par défaut. Parrapport au répertoire où vous avez installé le SDK on peut les trouver à l'emplacement suivant :

Citation

\android-sdk\extras\google\usb_driver

Pour les terminaux HTC, les drivers sont fournis dans le logiciel HTC Sync. Vous pouvez le télécharger ici.

Configuration du terminal

Tout naturellement, vous devez configurer votre téléphone comme on a configuré l'émulateur :

Et après ?

Ben rien ! La magie de l'informatique opère, tout devrait se faire de manière automatique (tout du moins sous Windows 7,

désolé pour les autres). Afin de vérifier que tout marche, le mieux est encore de relier le terminal à l'ordinateur.

Vous avez désormais un environnement de travail qui vous permette de créer des projets, de tester ces projets et de lesdébugger.

Il faut faudra moins de 2,11 Go pour tout installer. Dès le prochain chapitre on créera une petite application et on ladécortiquera.

Première application, celle qui vous rapportera desmillions

Ce chapitre est très important. Il vous permettra d'enfin mettre la main à la pâte mais surtout, on abordera la notion de cycled'une activité, qui est la base d'un programme pour Android. Si pour vous un programme en Java débute forcément par unMain, vous risquez d'être surpris . Une grande partie des applications Android que vous développerez contiendront une ou

plusieurs activités, c'est pourquoi il est totalement indispensable que vous maitrisiez ce concept.

Partie 1 : Les bases indispensables à toutes applications 24/89

www.siteduzero.com

Page 26: 554364-developpement-d-applications-pour-terminaux-android.pdf

Activité et vueQu'est-ce qu'une activité ?

Analysons un petit peu l'architecture d'une application Android. Si vous regardez par exemple le Market, vous avez plusieursécrans à l'intérieur même de l'application : la liste des applications les plus téléchargées, la liste des applications que vouspossédez déjà, le système qui permet de rechercher des applications, etc. Ces différents écrans sont des activités. On sait que cesont différentes activités parce qu'on passe d'un écran à un autre. Une application peut posséder plusieurs activités, mais n'enaffiche qu'une à la fois.

Attention cependant, on ne différencie pas des activités que parce qu'elles n'ont pas la même interface graphique !Une interface graphique peut très bien être dynamique, dans quelques leçons on s'amusera par exemple à faire grossirpuis rapetisser des boutons, l'interface graphique sera donc différente, mais on sera toujours dans la même activité. Deplus, un programmeur peut faire plusieurs activités avec la même interface graphique pour une raison ou pour uneautre.

On peut considérer une activité comme un support sur lequel se grefferont les éléments de l'interface graphique, en ce sensqu'elle permet aux éléments de l'interface graphique de se greffer dessus. Cependant, ce n'est pas son rôle que de créer et dedisposer les éléments graphiques, elle n'est que l’échafaudage. En revanche, elle s'occupera de définir les comportements quedoivent adopter les éléments de l'interface graphique. C'est donc l'activité qui détermine le comportement d'une page, mais passon esthétique.

Comme il est plus aisé de comprendre à l'aide d'exemples, imaginez-vous que vous naviguez sur internet avec votre téléphone,le tout en écoutant la musique qu'émet ce même téléphone. Il se passe deux choses évidentes dans votre systèmes :

La navigation permise par une interface graphique (la barre d'adresse et le contenu de la page web au moins).La musique, qui est diffusée en fond sonore, mais sur laquelle l'utilisateur ne peut agir à l'aide d'une interfacegraphique puisque l'utilisateur navigue en même temps !

Dans cette configuration, le navigateur web est une application qui affiche une activité, alors que le lecteur audio est aussi uneapplication mais qui n'affiche pas d'activité. En revanche, l'utilisateur peut s'il le désire quitter le navigateur pour aller voirl'interface graphique du lecteur audio afin d'arrêter la musique, et là la page qui affiche les contrôles du lecteur est uneactivité. Le lecteur propose certainement d'autres activités, dont une qui permet à l'utilisateur de choisir la chanson qu'il veutsur la carte SD du téléphone.

États d'une activité

Comme je vous l'ai déjà dit, si un utilisateur reçoit un appel il devient plus important qu'il puisse y répondre que d'écouter lachanson que votre application diffuse. Pour pouvoir toujours répondre à ce besoin, les développeurs d'Android ont pris deuxdécisions :

A tout moment votre application peut laisser place à d'autres priorités. Si votre application utilise trop de ressourcessystème, alors elle empêchera le système de fonctionner correctement et Android pourra décider de l'arrêter sans coupde semonce.Votre activité existera dans plusieurs états au cours de sa vie, par exemple un état actif pendant lequel l'utilisateurl'exploite, et un état de pause quand l'utilisateur reçoit un appel.

En fait, quand une application se lance, elle se met tout en haut de ce qu'on appelle la pile d'activité.

Une pile est une structure de données de type « FIFO » (First In, First Out ), c'est-à-dire qu'on a accès qu'à un seulélément de la pile, le tout premier élément, aussi appelé sommet. Quand on ajoute un élément à cette pile, il prendrala première place et deviendra le nouveau sommet. Quand on veut supprimer un élément, ce sera le sommet qui serasupprimé et l'objet en seconde place deviendra le nouveau sommet.

L'activité que voit l'utilisateur est celle qui se trouve au-dessus de la pile. C'est pourquoi quand un appel arrive, il se place ausommet de la pile et c'est lui qui s'affiche à la place de votre application, qui n'est plus qu'à la seconde place. Votre activitéreviendra uniquement à partir du moment où toutes les activités qui se trouvent au-dessus d'elle s'arrêtent et sortent de la pile.Une activité peut se trouver dans 3 états qui se différencient surtout par sa visibilité

État Visibilité Description

Active (« active »ou «running »)

Elle est visible en totalité.

Elle est sur le dessus de la pile, c'est ce que l'utilisateurconsulte en ce moment même et il peut l'utiliser dans sonintégralité.C'est cette application qui a le « focus », c'est-à-dire quel'utilisateur agit directement sur l'application.

Suspendue

L'activité est partiellement visible à l'écran.C'est le cas quand vous recevez un SMS et

Ce n'est pas sur cette activité qu'agit l'utilisateur. L'application n'a plus le focus, c'est l'application sus-jacentequi l'a. Pour que notre application récupère le focus,

Partie 1 : Les bases indispensables à toutes applications 25/89

www.siteduzero.com

Page 27: 554364-developpement-d-applications-pour-terminaux-android.pdf

Suspendue(« paused»)

qu'une fenêtre semi-transparente se pose devantvotre activité pour afficher le contenu dumessage et vous permettre d'y répondre parexemple.

l'utilisateur devra se débarrasser de l'application quil'obstrue, puis l'utilisateur pourra à nouveau interagir avec.Si le système a besoin de mémoire, il peut très bien tuerl'application (cette affirmation n'est plus vraie si vousutilisez un SDK avec l'API 11 minimum).

Arrêtée (« stopped»)

L'activité est tout simplement oblitérée par uneautre activité, on ne peut plus la voir du tout.

L'application n'a évidemment plus le focus, puisquel'utilisateur ne peut pas la voir, il ne peut pas agir dessus. Le système retient son état pour pouvoir reprendre mais ilpeut arriver que le système tue votre application pourlibérer de la mémoire système.

Notez bien que les couleurs de ce tableau sont assorties aux états associés dans le schéma ci-dessous.

Cycle de vie d'une activité

Une activité n'a pas de contrôle direct sur son propre état (et par conséquent vous non plus en tant que programmeur), il s'agitplutôt d'un cycle rythmé par les interactions avec le système et d'autres applications. Voici un schéma qui présente ce que l'onappelle le cycle de vie d'une activité , c'est-à-dire qu'il indique les étapes que va traverser notre activité pendant sa vie, de sanaissance à sa mort. Vous verrez que chaque étape du cycle est représentée par une méthode. Nous verrons comment utiliserces méthodes en temps voulu.

Directement traduit à partir d' un contenu fourni par Google

Partie 1 : Les bases indispensables à toutes applications 26/89

www.siteduzero.com

Page 28: 554364-developpement-d-applications-pour-terminaux-android.pdf

Les activités héritent de la classe « Activity ». Or, la classe Activity hérite de l'interface « Context » dont le but est dereprésenter tout ce qui « peut être une application ». Cette information peut vous sembler futile, mais elle est loin del'être, sachez-le.

Les vues (que nos amis anglais appellent view), sont ces fameux composants qui viendront se greffer sur notre échaudage, ils'agit de l'unité de base de l'interface graphique. Leur rôle est de fournir du contenu visuel avec lequel il est éventuellementpossible d'interagir. A l'instar de l'interface graphique avec Swing, il est possible de mettre en page les vues à l'aide deconteneurs.

Les vues héritent de la classe « View ».

Partie 1 : Les bases indispensables à toutes applications 27/89

www.siteduzero.com

Page 29: 554364-developpement-d-applications-pour-terminaux-android.pdf

Création d'un projetLancez Eclipse. Tout d'abord localisez l'emplacement de la barre d'outils d'Eclipse.

Pour lancer la création d'un projet à l'aide de l’assistant de création, cliquez sur le bouton de gauche de la barre d'outilsconsacrée à Android.

Une fenêtre s'ouvrira, vous pouvez la remplir comme ceci par exemple. Dans la suite de ce chapitre je considérerai que vousl'avez fait.

Partie 1 : Les bases indispensables à toutes applications 28/89

www.siteduzero.com

Page 30: 554364-developpement-d-applications-pour-terminaux-android.pdf

Voici ce que signifient tous les champs :

« Project name » est le nom de votre projet dans Eclipse. Ce champ n'influence pas du tout le projet en lui-même, justele nom sous lequel Eclipse connait ce projet. Le vrai nom de notre application, celui que reconnaitra Android, peut très

Partie 1 : Les bases indispensables à toutes applications 29/89

www.siteduzero.com

Page 31: 554364-developpement-d-applications-pour-terminaux-android.pdf

bien n'avoir aucune similitude avec ce que vous mettrez dans ce champ.

« Contents » le contenu, la première option vous permet de créer un projet à partir de zéro, la seconde d'utiliser desfichiers sources qui existent déjà. Par exemple si une personne a codé une application et qu'elle vous donne les sources,vous pourrez les importer dans un nouveau projet avec cette option. Nous allons créer un nouveau projet de toutepièce, nous choisirons donc la première option.Vous trouverez ensuite une case cochée par défaut. Si vous la laissez ainsi, le projet sera créé à l'endroit que l'on adéfini comme « Workspace » au premier lancement d'Eclipse, emplacement qui est rappelé juste en-dessous. Si vousdécochez cette case, les fichiers seront créés à un endroit que vous devrez spécifier.La troisième et dernière option créera un projet à partir des échantillons que vous avez téléchargés avec le SDK, si vousl'avez fait. Utile pour les disséquer et en étudier le comportement dans l'AVD !

« Build Target » est la version d'Android pour laquelle sera compilée votre application. J'avais décrété que je voulaisque mon application utilise l'API 7, c'est pourquoi j'ai choisi de compiler mon application pour la version 2.1d'Android.

« Properties » vous permettra tout d'abord de choisir le nom de votre application avec « Application name ». Cettefois-ci, il s'agit du nom qui apparaîtra sur l'appareil et... dans le Market pour vos futures applications ! Choisissez doncun nom qui semble correct, original et judicieux. J'ai choisi Preums. Oui bon.

Il faudra ensuite choisir dans quel package ira notre application.

Pour rappel, un package est un équivalent hiérarchisé des espaces de nommage. Imaginez, vous voulez fairedeux classes qui s'appellent « X ». Vous vous rendez bien compte qu'on ne pourra pas différencier les deuxclasses si on doit instancier un objet d'un des deux types « X », Java se demandera de laquelle des deuxclasses vous souhaitez parler puisqu'elles ont le même nom. Ce serait comme avoir deux fichiers avec lemême nom et la même extension dans un même répertoire ! C'est impossible parce que ce serait incohérent. Pour contrer ce type de désagréments, on organise les classes en packages. Comme ça vous pourrez avoirdeux classes « X », dans les packages « Y » et « Z » par exemple, et vous pourrez ainsi les utiliser enprécisant dans quel package se trouve la classe « X » dont vous avez besoin, avec la syntaxe « Y.X » pour laclasse « X » qui se trouve dans le package « Y » et « Z.X » pour la classe « X » qui se trouve dans le package« Z ». De plus, les packages peuvent avoir des parents afin d'avoir toute une hiérarchie de packages. Parexemple (totalement farfelu) « Web.Affichage.Image », « Web.Affichage.Video » et « Web.Telechargement» pour le code source d'un navigateur internet.

J'ai choisi de rassembler tous mes codes relatifs au Site Du Zéro dans le package « sdz » et tout ce qui est relatif auchapitre un dans « chapitreUn ». Ce package doit être unique et ne pas exister sur le Market si vous souhaitez y mettrevotre application. Le prochain encart « Create Activity » permet de choisir si vous voulez créer automatiquement uneactivité. Nous verrons plus tard ce qu'est une activité, pour l'instant sachez juste que le nom de l'activité peut s'appelerun peu comme vous le désirez (donc dans notre exemple, rien ne nous oblige à mettre Preums dans le nom, ni de leterminer par Activity).

Dans « Min SDK Version » on choisit quelle est la version minimum du SDK qui est acceptée. Si l'utilisateur possèdeune version d'Android en-dessous de cette indication, il ne pourra pas la télécharger depuis le Market. Il faut que vouscompreniez que ce chiffre est une indication pour indiquer au Market à quelles versions il ne faut absolument pasfournir cette application, les versions pour lesquelles l'application est destinée. Ce chiffre permet aussi à Android desavoir si le système doit s'adapter ou non. Si une application utilise l'API 7 et que le terminal est à l'API 13, un mode decompatibilité s'enclenchera afin de tenter d'améliorer les performances de l'application.

Pour finaliser la création, cliquez sur « Finish ».

Partie 1 : Les bases indispensables à toutes applications 30/89

www.siteduzero.com

Page 32: 554364-developpement-d-applications-pour-terminaux-android.pdf

Un non-"Hello world!"Vous trouverez les fichiers créés dans le « Package Explorer ».

On trouve notre premier grand répertoire « src/ », celui qui contiendra tous les fichiers sources « .java ». Ouvrez le fichier «PreumsActivity.java ». Les autres fichiers ne nous regardent pas pour l'instant. Voici le contenu de ce fichier:

Code : Java

package sdz.chapitreUn.preums;

import android.app.Activity;import android.os.Bundle;

public class PreumsActivity extends Activity {

@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); }}

Ah ! On reconnait des termes que je viens tout juste d'expliquer ! Je vais prendre toutes les lignes une par une histoire d'êtrecertain de ne déstabiliser personne.

Package

Code : Java

package sdz.chapitreUn.preums;

Là on déclare que notre programme se situe dans le package « sdz.chapitreUn.preums », comme expliqué précédemment. Sion veut faire référence à notre programme, il faudra faire référence à ce package.

Import

Code : Java

import android.app.Activity;import android.os.Bundle;

On importe deux classes qui se trouvent dans deux packages différents : les classes Activity et Bundle.

Partie 1 : Les bases indispensables à toutes applications 31/89

www.siteduzero.com

Page 33: 554364-developpement-d-applications-pour-terminaux-android.pdf

Class

Code : Java

public class PreumsActivity extends Activity{ ...}

Comme indiqué dans la section précédente, une activité dérive de la classe Activity.

onCreate

Code : Java

@Overridepublic void onCreate(Bundle savedInstanceState){ ...}

Le petit @Override permet d'indiquer que l'on va redéfinir une méthode qui existait auparavant, ce qui est logique puisquevous saviez déjà qu'une activité avait une méthode void onCreate() et que notre classe hérite de Activity.

Cette méthode est la première qui est lancée au démarrage d'une application, mais elle est aussi appelée après qu'uneapplication se soit faite tuée par le système en manque de mémoire ! C'est à cela que sert l'attribut de type Bundle :

S'il s'agit du premier lancement de l'application ou d'un démarrage alors qu'elle avait été quittée normalement, il vautnull.Mais s'il s'agit d'un retour à l'application après qu'elle a perdu le focus et a redémarré, alors il pourra contenir un étatsauvegardé de l'application que vous aurez pris soin de constituer. Par exemple, l'utilisateur sera content si la chansonqu'il écoutait reprenait exactement à l'endroit où elle s'est arrêtée avant d'être sauvagement interrompue par un appel.

Dans cette méthode, vous devez définir ce qui doit être recréé à chaque fois que l'application est lancée après que l'utilisateuren soit sorti (volontairement ou non), donc l'interface graphique et toutes les variables à initialiser par exemple.

Super !

Code : Java

super.onCreate(savedInstanceState);

L'instruction super signifie qu'on fait appel à une méthode ou un attribut qui appartient à la superclasse de la méthodeactuelle, autrement dit la classe juste au-dessus dans la hiérarchie de l'héritage, c'est-à-dire la classe Activity.

Ainsi, super.onCreate fait appel au onCreate de la classe Activity, mais pas au onCreate de PreumsActivity. En fait, leonCreate de la classe Activity va procéder à des initialisations à partir de ce fichier. Il gère bien entendu le cas où le Bundleest null.

Cette instruction est obligatoire.

setContentView

Code : Java

setContentView(R.layout.main);

Cette ligne trouvera son explication au sein du prochain chapitre. Sachez juste qu'en dépit de son aspect étrange, elle a un sensbien précis. Pour l'instant, remplacez toute la classe par celle-ci:

Code : Java

public class PreumsActivity extends Activity {

Partie 1 : Les bases indispensables à toutes applications 32/89

www.siteduzero.com

Page 34: 554364-developpement-d-applications-pour-terminaux-android.pdf

{ TextView coucou = null;

@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); coucou = new TextView(this); coucou.setText("Bonjour, vous me devez 1 000 000€."); setContentView(coucou); }}

Nous avons rajouté un attribut de classe que j'ai appelé coucou. Cet attribut est de type « TextView », j'imagine que le nom estdéjà assez explicite . Il s'agit d'une vue (« View »)... qui représente un texte (« Text »). Tout simplement. La méthode

public void setContentView (View vue) sert à faire en sorte que l'interface graphique associée à l'activité soit lavue passée en paramètre.

Partie 1 : Les bases indispensables à toutes applications 33/89

www.siteduzero.com

Page 35: 554364-developpement-d-applications-pour-terminaux-android.pdf

Lancement de l'applicationVous vous souvenez, je vous ai dit de ne pas fermer votre AVD de préférence ? Vous verrez que ça vous économisera un tempsconsidérable, celui de lancement de l'AVD, ce qui n'est pas négligeable. Si vous l'avez fermé ce n'est pas grave, il s'ouvrira toutseul, mais que c'est lent...

Pour lancer notre application, regardez la barre d'outils d'Eclipse.

Et cherchez cet encart-là :

Il vous suffit de cliquer sur le deuxième bouton (celui qui ressemble au symbole « play »). Une fenêtre s'ouvrira pour vousdemander comment exécuter l'application. Sélectionnez « Android Application ».

Si vous avez plusieurs terminaux, l'écran suivant s'affichera (sauf si vous n'avez pas de terminal de connecté, auquel cas onpasse directement à l'écran suivant) :

Partie 1 : Les bases indispensables à toutes applications 34/89

www.siteduzero.com

Page 36: 554364-developpement-d-applications-pour-terminaux-android.pdf

On vous demande sur quel terminal vous voulez faire le test. A vous de voir. Une fois le test fait, cliquez sur « OK ».

Regardez votre terminal de test et voilà ! L'utilisateur (naïf) vous doit 1 000 000€ !

Voilà, vous pouvez reprendre votre souffle, l'immonde cycle de vie des activités a été abordé. Il est indispensable de lecomprendre, et ce pourrait être une bonne idée de le retenir un minimum aussi.

J'avoue, l'intérêt des applications que vous pouvez développer est assez limité. En fait le problème est que vous ne savez pourl'instant ne mettre qu'une vue par activité. Dans le prochain chapitre, on apprendra quelles sont les méthodes pour lier uneactivité et une vue. De plus, on comprendre ce que signifie l'étrange commande setContentView(R.layout.main);.

Les ressources (généralités)

Partie 1 : Les bases indispensables à toutes applications 35/89

www.siteduzero.com

Page 37: 554364-developpement-d-applications-pour-terminaux-android.pdf

Je vous ai déjà présenté le répertoire « src/ » qui contient toutes les sources de votre programme. On va maintenant s'intéresserà un autre grand répertoire: « res/ ». Vous l'aurez compris, c'est dans ce répertoire que sont conservées les ressources, autrementdit les éléments qui s'afficheront à l'écran ou qui influenceront ce qui s'affichera à l'écran.

Android est destiné à être utilisé sur un très grand nombre de supports différents, et il faut par conséquent s'adapter à cessupports. Imaginons qu'une application ait à afficher une image. Si on prend une petite image, pour qu'elle n'ait pas unedimension ridicule sur un grand écran il faut l’agrandir. Mais en faisant, l'image perdra presque certainement en qualité. Unesolution serait donc d'avoir une image pour les petits écrans, une pour les écrans moyens et une pour les grands écrans.

On parlera beaucoup de fichiers « XML » dans ce chapitre. Si vous ignorez ce dont il s'agit, lisez impérativement leparagraphe ci-dessous, sinon, vous pouvez passer directement au second.

Partie 1 : Les bases indispensables à toutes applications 36/89

www.siteduzero.com

Page 38: 554364-developpement-d-applications-pour-terminaux-android.pdf

Le format XMLLe XML est un langage de balisage un peu comme « HTML » qui en est en fait dérivé. Le principe d'un langage de balisageest qu'on ne cherche à travers ces fichiers qu'à donner des informations, à exprimer des données, pas à faire des calculs commeen C ou en Java. Les fichiers qui respectent la syntaxe d'un langage de balisage ne font rien en eux-mêmes, il faut qu'ils soientinterprétés pour révéler leur intérêt. Par exemple pour le HTML, c'est un navigateur qui interprète le code afin de donner unsens aux instructions ; si vous lisez un document HTML sans interpréteur, vous ne verrez que les sources, pas l'interprétationdes balises.

Comme pour le format HTML, un fichier XML débute par une déclaration qui permet d'indiquer qu'on se trouve bien dans unfichier XML.

Code : XML

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

Cette ligne permet d'indiquer que:

On utilise la version 1.0 de XML.On utilise l'encodage des caractères qui s'appelle « utf-8 », c'est une façon de décrire les caractères que contiendra notrefichier.

Je vais maintenant vous détailler un fichier qui pourrait exister dans la réalité.Code : XML

<?xml version="1.0" encoding="utf-8"?><bibliotheque> <livre style="fantaisie"> <auteur>George R. R. MARTIN</auteur> <titre>A Game Of Thrones</titre> <langue>klingon</langue> <prix>10.17</prix> </livre> <livre style="aventure"> <auteur>Alain Damasio</auteur> <titre>La Horde Du Contrevent</titre> <prix devise="euro">9.40</prix> <recommandation note="20"/> </livre></bibliotheque>

L'élément de base du format XML est la balise. Elle commence par un chevron ouvrant « < » et se termine par un chevronfermant « > ». Entre ces deux chevrons, on trouve au minimum un mot. Par exemple <bibliotheque>. Cette balises'appelle « balise ouvrante », autant vous dire tout de suite qu'il faudra la fermer cette balise ! Il existe deux manières defermer une balise ouvrante :

Soit par une « balise fermante » </bibliotheque>, auquel cas vous pourrez avoir du contenu entre la baliseouvrante et la balise fermante. Étant donné que notre bibliothèque est destinée à contenir plusieurs livres, nous avonsopté pour cette solution.Soit on ferme la balise directement dans son corps <bibliotheque />. La seule différence est que comme il n'y apas de balise fermante, on ne peut pas mettre de contenu entre deux balises. Dans notre exemple, nous avons mis labalise <recommandation note="20"/> sous cette forme par choix, mais nous aurions tout aussi bien pu utiliser<recommandation>20</recommandation>.

Ce type d'informations, qu'il soit fermé par une balise fermante ou qu'il n'en n'ait pas besoin, s'appelle un « nœud ». Vousvoyez donc que l'on a un nœud appelé bibliothèque, deux nœuds appelés livre, etc.

Rappelez-vous, le format XML n'a pas de sens en lui-même. Là, notre nœud s'appelle bibliothèque, on en déduit, noushumains, qu'il représente une bibliothèque, mais si on avait décidé de l'appeler fkldjsdfljsdfkls, il aurait autant desens au niveau informatique. C'est à vous d'attribuer un sens à votre fichier XML au moment de l'interprétation.

Le nœud bibliothèque, qui est le nœud qui englobe tous les autres nœuds, s'appelle « la racine ». Il y a dans un fichier XMLau moins une racine et au plus une racine. On peut établir toute une hiérarchie dans un fichier XML. En effet, entre la baliseouvrante et la balise fermante d'un nœud on peut mettre d'autres nœuds. Les nœuds qui se trouvent dans un autre nœuds'appellent des « enfants » de ce nœud, et le nœud encapsulant s'appelle le « parent ».

Partie 1 : Les bases indispensables à toutes applications 37/89

www.siteduzero.com

Page 39: 554364-developpement-d-applications-pour-terminaux-android.pdf

Les nœuds peuvent avoir des « attributs » pour indiquer des informations, comme pour le nœud « prix » qui a l'attribut «devise », afin de préciser en quelle devise est exprimé ce prix : <prix devise="euro">9.40</prix> pour « LaHorde Du Contrevent » qui vaut 9€40. Vous remarquerez que pour « A Game Of Thrones », on a aussi le nœud « prix »,mais il n'a pas l'attribut « devise » ! C'est tout à fait cohérent, c'est juste que dans mon interpréteur (que je ne vous montreraipas puisqu'on s'en fiche) si la devise est précisée alors je considère que le prix est exprimé en cette devise, mais si l'attribut «devise » n'est pas précisé, alors le prix est en dollars. « A Game Of Thrones » vaut 10$17 et « La Horde Du Contrevent »vaut lui 9€40. Le format XML en lui-même ne peut pas détecter si l'absence de l'attribut « devise » est une anomalie ou non, çaretirerait toute la liberté que permet le format.

En revanche, le XML est intransigeant sur la syntaxe. Si vous ouvrez une balise, n'oubliez pas de la fermer ! N'hésitez pas àrevenir ici en cas de besoin.

Partie 1 : Les bases indispensables à toutes applications 38/89

www.siteduzero.com

Page 40: 554364-developpement-d-applications-pour-terminaux-android.pdf

Les différents types de ressourcesLes ressources sont des éléments capitaux dans une application Android. On y trouve par exemple des chaînes de caractères oudes images. Comme Android est destiné à être utilisé sur une grande variété de supports, il fallait trouver une solution pourpermettre à une application de s'afficher de la même manière sur un écran 7" que sur un écran 10", ou faire en sorte que lestextes s'adaptent à la langue de l'utilisateur. C'est pourquoi on organise les différents éléments qui doivent s'adapter de manièretrès précise, de façon à ce qu'Android sache quels éléments utiliser pour quels types de terminaux.

On découvre les ressources à travers une hiérarchie particulière de répertoires. Vous pouvez remarquer qu'à la création d'unnouveau projet, Eclipse crée certains répertoires par défaut.

Je vous ai déjà dit que les ressources étaient divisées en plusieurs types. Pour permettre à Android de retrouver facilement cestypes, chaque type de ressources est associé un répertoire particulier. Voici un tableau qui vous indique les principalesressources que l'on peut trouver, avec le nom du répertoire associé. Vous remarquerez que tous les répertoires ne sont pas crééspar défaut, c'est parce que ne sont créés que les répertoires les plus courants.

Type Description Analysesyntaxique

Dessin etimage («res/drawable»)

On y trouve les images matricielles (les images du type .PNG, .JPEG ou encore .GIF). On y trouve aussi des fichiers XML dont le contenu décrit des formes ou des dessins.

Oui

Mise en page(« res/layout»)

Les fichiers XML qui représentent la disposition que doivent adopter les vues (on aborderacet aspect, qui est très vaste, dans le prochain chapitre).

Exclusivement

Menu (« res/menu»)

Les fichiers XML pour pouvoir constituer des menus. Exclusivement

Donnée brut (« res/raw »)

Données diverses au format brut. Ces données n'ont pas de méthodes spécifiques dansAndroid pour les traiter. On peut imaginer y mettre de la musique ou des fichiers HTMLpar exemple.

Le moinspossible

Donnée (« res/values»)

Il est plus difficile de cibler les ressources qui appartiennent à cette catégorie tant elles sontnombreuses. On y trouve entre autre des chaines de caractères, des dimensions, descouleurs, ...

Exclusivement

La colonne « Analyse syntaxique » indique la politique à adopter pour les fichiers XML de ce répertoire. Elle vaut :

« Exclusivement » si les fichiers de cette ressources sont tout le temps des fichiers XML.« Oui » si les fichiers peuvent être d'un autre type qu'XML, en fonction de ce qu'on veut faire.

Partie 1 : Les bases indispensables à toutes applications 39/89

www.siteduzero.com

Page 41: 554364-developpement-d-applications-pour-terminaux-android.pdf

« Le moins possible » si les fichiers doivent de préférence ne pas être de type XML. Un fichier XML se trouvera dansce répertoire uniquement s'il n'a pas sa place dans un autre répertoire.

Il existe d'autres répertoires pour d'autres types de ressources, mais je ne vais pas toutes vous les présenter. De toute manière,on peut déjà faire des applications complexes avec ces ressources-là.

Ne mettez pas de ressources directement dans « res/ », sinon vous aurez une erreur de compilation !

Partie 1 : Les bases indispensables à toutes applications 40/89

www.siteduzero.com

Page 42: 554364-developpement-d-applications-pour-terminaux-android.pdf

L'organisationMais pourquoi tu nous dis que les drawables se trouvent dans le répertoire « res/drawable », alors que sur l'image onvoit clairement que tu as 3 répertoires « res/drawable-hpdi », « res/drawable-ldpi » et « res/drawable-mdpi » ?

Je vous ai dit qu'on aurait plusieurs ressources en fonction du matériel. Les emplacements indiqués dans le tableau précédentsont les emplacements par défaut, mais il est possible de définir d'autres emplacements pour préciser le matériel de destinationafin de se conformer au matériel de l'utilisateur. Il y a une syntaxe très précise à respecter pour qu'Android sache dans quelrépertoire il doit fouiller.

En partant du nom du répertoire par défaut, on va créer d'autres répertoires qui permettent de préciser à quels types dematériels les ressources de ce répertoire sont destinées. Les restrictions sont représentées par des quantificateurs et ce sont cesquantificateurs qui vont permettront de préciser le matériel de destination. La syntaxe à respecter peut-être représentée ainsi «res/<type_de_ressource>[<-quantificateur>]? ». Autrement dit, on peut n'avoir aucun quantificateur si l'on veut définirl'emplacement par défaut, ou en avoir un pour réduire le champ de destination, deux pour réduire encore plus, etc. Cesquantificateurs sont séparés par un tiret. Si Android ne trouve pas d'emplacement dont le nom corresponde exactement auxspécifications techniques du terminal, il cherchera parmi les autres répertoires qui existent la solution la plus proche. Voici laliste des principaux quantificateurs (il y en a 14 en tout, dont un bon paquet qu'on utilise que rarement, j'ai donc décidé de lesignorer) :

Priorité

Quantificateur Fourchette de données Description

2Langue etrégion

Exemples:« en » pour anglais.« fr » pour français.« fr-rFR » pour françaismais uniquement le françaisutilisé en France.« fr-rCA »pour français maisuniquement le françaisutilisé au Québec....

La langue du système de l'utilisateur. On indique unelangue puis, éventuellement, on peut préciser une régionavec « -r ».

3Taille del'écran

smallnormallargexlarge

Il s'agit de la taille de la diagonale de l'écran.

5Orientation del'écran

portland

Port est le diminutif de « portrait », donc quand leterminal est en mode portrait .Land est le diminutif de « landscape », donc quand leterminal est en mode paysage.

8Résolution del'écran

ldpimdpihdpixhdpinodpi

ldpi: environ 120 dpi.mdpi: environ 160 dpi.hdpi: environ 240 dpi.xhdpi: environ 320 dpi (disponible à partir del'API 8 uniquement).nodpi: pour ne pas redimensionner les imagesmatricielles.

14Versiond'Android

Exemple:v3v5v7...

Le niveau de l'API.

Dans les répertoires vus précédemment, que se passe-t-il si l'écran du terminal de l'utilisateur a une grande résolution ? Androidira chercher dans « res/drawable-hpdi » ! L'écran du terminal de l'utilisateur a une petite résolution ? Il ira chercher dans «res/drawable-ldpi » ! L'écran du terminal de l'utilisateur a une très grande résolution ? Et bien... il ira chercher dans «

Partie 1 : Les bases indispensables à toutes applications 41/89

www.siteduzero.com

Page 43: 554364-developpement-d-applications-pour-terminaux-android.pdf

res/drawable-hpdi » puisqu'il s'agit de la solution la plus proche de la situation matérielle réelle.

Exemples et règles à suivre

« res/drawable-small » pour avoir des images spécifiquement pour les petits écrans.« res/layout-fr-rFR » pour avoir une mise en page spécifique destinée à ceux qui ont choisi la langue Français(France).« res/values-fr-rFR-port » pour des données qui s'afficheront uniquement à ceux qui ont choisi la langue Français(France) et dont le téléphone se trouve en orientation portrait.« res/values-port-fr-rFR » n'est pas possible, il faut mettre les quantificateurs par ordre croissant de priorité .« res/layout-fr-rFR-en » n'est pas possible puisqu'on a deux quantificateurs de même priorité et qu'il faut toujoursrespecter l'ordre croissant des priorités. Il faut créer un répertoire pour le français et un répertoire pour l'anglais.

Tous les répertoires de ressources qui sont différenciés par des quantificateurs devront avoir le même contenu, puisqu'onindiquera à Android de quelle ressource on a besoin, on indiquera le type de ressource, mais on ne se préoccupera pas dechoisir dans quel répertoire aller le chercher, Android le fera très bien pour nous. Vous voyez que notre icône se trouve dansles trois répertoires « drawable », sinon Android ne pourrait pas la trouver pour les trois types de configuration.

Mes recommandations

Voici les règles que je respecte pour chaque projet.

« res/drawable-hdpi ».« res/drawable-ldpi ».« res/drawable-mdpi ».Pas de « res/drawable ».« res/layout-land ».« res/layout ».

Une mise en page pour chaque orientation, et des images adaptées pour chaque résolution. Le quantificateur de l'orientationest surtout utile pour la mise en page. Le quantificateur de la résolution lui sert plutôt à ne pas avoir à ajuster une image et parconséquent à ne pas perdre de qualité.

Pour finir, sachez que les écrans de taille « small » se font rares.

Partie 1 : Les bases indispensables à toutes applications 42/89

www.siteduzero.com

Page 44: 554364-developpement-d-applications-pour-terminaux-android.pdf

Ajouter un fichier avec EclipseHeureusement, les développeurs de l'ADT sont de bonnes personnes, et ont créé un petit menu qui vous aidera à créer desrépertoires de manière simple, sans avoir à retenir de syntaxe. Par contre il vous faudra parler un peu anglais, je le crains.Faites un clic droit sur n'importe quel répertoire ou fichier de votre projet. Vous aurez un menu un peu similaire à celui quereprésente l'image suivante qui s'affichera:

Dans le sous-menu « New », cliquez sur « Android XML File ». Si vous ne le trouvez pas, allez dans « Other... » puischerchez le dans le répertoire « Android ». Cette opération ouvrira un assistant de création de fichiers XML.

Partie 1 : Les bases indispensables à toutes applications 43/89

www.siteduzero.com

Page 45: 554364-developpement-d-applications-pour-terminaux-android.pdf

Le premier champ vous permet de sélectionner dans quel projet vous souhaitez ajouter le fichier. Le bouton « Browse... »vous aidera à sélectionner un projet. Le champ « File » vous permet quant à lui de choisir le nom du fichier à créer. La listesuivante, avec les boutons radios, vous permet de sélectionner quel type de ressources vous intéresse. Vous retrouverez lesnoms des ressources que nous avons décrites dans le premier tableau, à l'exception de « raw ». Logique, nous allons créer unfichier XML et les fichiers XML devraient en théorie ne pas se situer dans ce répertoire.

La section suivante contient deux listes. La liste de gauche présente les quantificateurs à appliquer au répertoire dedestination. Vous voyez qu'ils sont rangés dans l'ordre de priorité que j'ai indiqué. Ceux que vous connaissez sont:

« Language » pour la langue.« Region » pour la région. Il s'agit d'un paramètre qui est facultatif mais s'il est présent, il est toujours associé à unelangue. Essayez de mettre une région sans une langue et Eclipse vous grondera. Il faut écrire la région sans le r.« Size » est la taille de l'écran.« Orientation » est l'orientation de l'écran.« Density » pour la résolution de l'écran.« Version » pour la version de l'API de l'utilisateur.

Mais, il y a beaucoup plus de quantificateurs et de ressources que ce que tu nous as indiqué !

Oui. Comprenez, je n'écris pas une documentation officielle pour Android ici. Si je le faisais, j'en laisserais plus d'un confus et

Partie 1 : Les bases indispensables à toutes applications 44/89

www.siteduzero.com

Page 46: 554364-developpement-d-applications-pour-terminaux-android.pdf

Oui. Comprenez, je n'écris pas une documentation officielle pour Android ici. Si je le faisais, j'en laisserais plus d'un confus etvous aurez un nombre impressionnant d'informations qui ne vous serviront pas tellement. Je m'attèle à vous apprendre à fairede jolies applications optimisées et fonctionnelles, pas à faire de vous des docteurs ès Android.

Le champ suivant, « Folder » est le répertoire de destination. Quand vous sélectionnez des quantificateurs vous pouvez avoirun aperçu en temps réel de ce répertoire. Si vous avez commis une erreur dans les quantificateurs, par exemple choisir unelangue qui n’existe pas, le quantificateur ne s'ajoutera pas dans le champ du répertoire. Si ce champ ne vous semble pas correctvis-à-vis des quantificateurs sélectionnés, c'est que vous avez fait une faute d'orthographe. Si vous écrivez directement unrépertoire dans « Folder », les quantificateurs indiqués s'ajouteront dans la liste correspondante.

A mon humble opinion, la meilleure pratique est d'écrire le répertoire de destination dans « Folder » et de regarder siles quantificateurs choisis s'ajoutent bien dans la liste. Mais personne ne vous en voudra d'utiliser l'outil prévu pour

.

Cet outil peut gérer les erreurs et conflits. Si vous indiquez comme nom « strings » et comme ressource une donnée (« values»), vous verrez un petit avertissement qui s'affichera en haut de la fenêtre, puisque ce fichier existe déjà (il est créé par défaut).

Petit exercice

Allez, histoire de vérifier que vous avez bien compris. Essayez, sans passer par les outils d'automatisation, d'ajouter une miseen page destinée à la version 8, quand l'utilisateur penche son téléphone en mode portrait alors qu'il utilise le français desbelges et que son terminal a une résolution moyenne.

Secret (cliquez pour afficher)

Le « Folder » doit contenir EXACTEMENT « /res/layout-fr-rBE-port-mdpi-v8 ».

Il vous suffit de cliquer sur « Finish » si aucun message d'erreur ne s'affiche.

Partie 1 : Les bases indispensables à toutes applications 45/89

www.siteduzero.com

Page 47: 554364-developpement-d-applications-pour-terminaux-android.pdf

Récupérer une ressourceLa classe R

On peut accéder à cette classe qui se trouve dans le répertoire « gen/ » (comme generated, c'est-à-dire que tout ce qui setrouvera dans ce répertoire sera généré automatiquement) :

Ouvrez donc ce fichier. Oh ce code, ces noms... Ca vous rappelle quelque chose ? Comparons avec l'ensemble des

ressources que comporte notre projet.

Code : Java

/* AUTO-GENERATED FILE.DO NOT MODIFY.** This class wasautomatically generatedby the* aapt tool from theresource data it found.It* should not be modifiedby hand.*/

packagesdz.chapitreUn.deums;

public final class R { public static finalclass attr { } public static finalclass drawable { public staticfinal inticon=0x7f020000; } public static finalclass layout { public staticfinal intmain=0x7f030000; } public static finalclass string { public staticfinal intapp_name=0x7f040001; public staticfinal inthello=0x7f040000; }}

Partie 1 : Les bases indispensables à toutes applications 46/89

www.siteduzero.com

Page 48: 554364-developpement-d-applications-pour-terminaux-android.pdf

Bizarre... on remarque en effet une certainement ressemblance, mais elle n'est pas parfaite ! Décryptons déjà un peu le code.La classe Layout

Code : Java

public static final class layout { public static final int main=0x7f030000;}

Il s'agit d'une classe déclarée dans une autre classe. C'est ce qui s'appelle une classe interne ; une classe interne est une classedéclarée à l'intérieur d'une autre classe, sans grande particularité. Cependant, pour y accéder, il faut faire référence à la classequi la contient. Cette classe est de type public static final et de nom layout.

Un élément public est un élément auquel tout le monde peut accéder sans aucune restriction.Le mot clé static, dans le cas d'une classe interne, signifie que la classe n'est pas liée à une instanciation de la classequi l'encapsule. Pour accéder à layout, on ne doit pas nécessairement créer un objet de type R. On peut y accéder parR.layout.Le mot clé final signifie que l'on ne peut pas créer de classe dérivée de layout.

Cette classe contient un unique public int, affublé des modificateurs static et final. Il s'agit par conséquent d'uneconstante, à laquelle n'importe quelle autre classe peut accéder sans avoir à créer d'objet de type layout ni de type R.

Cet entier est de la forme « 0xZZZZZZZZ ». Quand un entier commence par « 0x », c'est qu'il s'agit d'un nombrehexadécimal sur 32 bits. Je crois bien en avoir perdu quelques-uns là.

Les nombres que vous utilisez tous les jours pour compter sont exprimés avec le système décimal. On commence parle chiffre 0, dans l'ordre croissant on passe à 1, on augmente jusqu'à arriver à 9, et si on augmente encore on passe à10. On a ainsi de 0 à 9, dix unités (système décimal).

Avec le système hexadécimal, on débute toujours à 0, dans l'ordre croissant on passe à 1, puis à 2, jusqu'à 9. Maisaprès 9 vient A. A n'est pas une unité spéciale. Tout comme 5 est l'unité après 4, A vient après 9, mais comme on adéjà utilisé tous les chiffres connus, on a utilisé une lettre à la place d'une nouvelle unité inventée de toute pièce.Après A on a B, puis C, et ce jusqu'à F. Après F seulement arrive 10, puis 11, jusqu'à 19, puis 1A, jusqu'à 1F, qui estsuivi de 20. On a ainsi de 0 à F, seize unités (système hexadécimal).

Le fait qu'il soit exprimé en 32 bits signifie que ce nombre est constitué de 8 chiffres (il y a 8 « Z »).

Si vous n'avez rien compris, ce n'est pas grave. Sachez juste qu'il s'agit d'un nombre comme les autres, mais sousune autre forme. Ne soyez juste pas surpris d'y voir des lettres, c'est quand même un entier.

Cet entier a le même nom qu'un fichier de ressources, tout simplement parce qu'il représente ce fichier. On ne peut donc avoirqu'un seul attribut de ce nom-là dans la classe, puisque deux fichiers qui appartiennent à la même ressource se trouvent dans lemême répertoire et ne peuvent par conséquent pas avoir le même nom. Cet entier est un identifiant unique pour le fichier demise en page qui s'appelle main. Si un jour on veut utiliser ou accéder à cette mise en page depuis notre code, on y fera appelà l'aide de cet identifiant.

La classe Drawable

Code : Java

public static final class drawable { public static final int icon=0x7f020000;}

Contrairement au cas précédent, on a un seul entier pour 3 fichiers ! On a vu dans la section précédente qu'il fallait nommer defaçon identique ces 3 fichiers qui ont la même fonction, pour une même ressource, mais avec des quantificateurs différents. Etbien quand vous ferez appel à l'identificateur, Android saura qu'il lui faut le fichier icon et déterminera automatiquement quelest le répertoire le plus adapté à la situation du matériel, parmi les répertoires des ressources drawable puisqu'on se trouve dansla classe drawable.

La classe String

Partie 1 : Les bases indispensables à toutes applications 47/89

www.siteduzero.com

Page 49: 554364-developpement-d-applications-pour-terminaux-android.pdf

Code : Java

public static final class string { public static final int app_name=0x7f040001; public static final int hello=0x7f040000;}

Cette fois, si on a deux entiers, c'est tout simplement parce qu'on a deux chaînes de caractères dans le répertoire qui contientles chaînes de caractères (qui sont des données), le répertoire « res/values ». Comme on a qu'un fichier « strings.xml » dans cerépertoire, on en déduit que c'est lui qui contient la déclaration de ces deux chaînes de caractères.

On verra comment dans un prochain chapitre.

Je ne le répéterai jamais assez, ne modifiez JAMAIS ce fichier par vous-même. Jamais. Eclipse s'en

occupera.

Application

Énoncé

J'ai créé un nouveau projet pour l'occasion, mais vous pouvez très bien vous amuser avec le premier projet. L'objectif ici serade récupérer la ressource de type chaîne de caractères qui s'appelle « hello » (qui est créée automatiquement par Eclipse) etqu'on mettra comme texte dans un TextView. On fera ensuite afficher le TextView par l'application.

Instructions

On utilisera la méthode public final void setText (int identifiant_de_la_ressource) de laclasse TextView.

Ma solution

Secret (cliquez pour afficher)

Code : Java

public class Main extends Activity { TextView text = null; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);

text = new TextView(this); text.setText(R.string.hello);

setContentView(text); }}

Comme indiqué auparavant, on peut accéder aux identificateurs sans instancier de classe. On récupère dans la classe R,l'identificateur de la ressource du nom hello qui se trouve dans la classe string puisqu'il s'agit d'une chaîne de caractères,donc R.string.hello .

Et si je mets à la place de l'identifiant d'une chaîne de caractères, un identifiant qui correspond à un autre type deressources ? je suis machiavélique.

Et bien les ressources sont des objets Java comme les autres. Par conséquent ils peuvent aussi posséder une méthode publicString toString() ! Pour ceux qui l'auraient oubliés, la méthode public String toString() est appelée sur unobjet pour le transformer en chaîne en caractères, par exemple si on veut passer l'objet dans un System.out.println.

Partie 1 : Les bases indispensables à toutes applications 48/89

www.siteduzero.com

Page 50: 554364-developpement-d-applications-pour-terminaux-android.pdf

Essayez par vous-même, vous verrez ce qui se produit . Soyez curieux ! C'est comme ça qu'on apprend.

Application

Énoncé

Je vous propose un autre exercice. Dans l'exercice précédent, le TextView a récupéré l'identifiant et a été chercher la chaîne decaractères associée pour l'afficher. Dans cet exercice, on va plutôt récupérer la chaîne de caractères pour la manipuler.

Instructions

On va récupérer le gestionnaire de ressources. C'est un objet de la classe Resource que possède notre activité et quipermet d'accéder aux ressources de cette activité. On peut le récupérer grâce à la méthode public ResourcesgetResources ().On récupère la chaîne de caractère « hello » grâce à la méthode getString(int identifiant_de_la_ressource).On modifie la chaîne récupérée et on cherche le jeu de mot le plus nase possible.

Ma solution

Secret (cliquez pour afficher)

Code : Java

public class Main extends Activity{ TextView text = null; String hello = null; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); hello = getResources().getString(R.string.hello); hello = hello.replace(", ", ", poil dans la "); text = new TextView(this); text.setText(hello); setContentView(text); }}

Vous pouvez maintenant revenir au chapitre précédent et comprendre la ligne que je vous avais dit d'oublier. C'est limpidemaintenant non ?

Les ressources sont les outils de base de contenu pour une application Android. On a malheureusement pas beaucoup pratiquépendant ce chapitre, mais sachez que dès le prochain on met les mains dans le cambouis.

Les ressources (l'interface graphique - composantsprincipaux)

Une interface graphique est une association de pictogrammes avec lesquels peut interagir l'utilisateur et qui doivent secomporter de manière cohérente les uns vis-à-vis des autres. Pour l'instant, tous les composants graphiques que nous avonscréés l'ont été en Java. Cependant ce n'est pas la méthode à privilégier. En fait, on manipulera l'interface graphique de manièreprogrammatique uniquement quand il s'agira de rendre cette interface graphique dynamique, comme pour déterminer lecomportement quand on clique sur un bouton ou agrandir une fenêtre quand un utilisateur l'étire.

Pour constituer une interface graphique statique, on privilégiera les ressources, puisque souvenez-vous, la mise en page estune ressource. On va apprendre ici à concevoir une interface graphique en manipulant le fichier XML et surtout à interagiravec nos vues.

Une interface graphique pour Android est tout simplement un assemblage de vues, et une vue s'appuyera par moment surd'autres ressources pour leur fournir du contenu.

Partie 1 : Les bases indispensables à toutes applications 49/89

www.siteduzero.com

Page 51: 554364-developpement-d-applications-pour-terminaux-android.pdf

L'interface d'EclipseOuvrez le seul fichier qui se trouve dans le répertoire « res/layout » :

En l'ouvrant, vous tomberez sûrement sur un écran de ce genre :

Cet outil vous aide à mettre en place les vues (dans le menu de gauche, regardez on retrouve les TextView) directement sur lamise en page représentée à droite. Cependant, il ne peut remplacer la manipulation de fichiers XML à mon opinion, c'estpourquoi je ne le présenterai pas, mais avis aux auteurs de tuto' . En revanche, je le considère très pratique dès qu'il s'agit

d'afficher un petit aperçu final de ce que donnera ce que vous avez développé avec le fichier XML. C'est pourquoi je ne vaisprésenter que cet aspect de l'outil.

Partie 1 : Les bases indispensables à toutes applications 50/89

www.siteduzero.com

Page 52: 554364-developpement-d-applications-pour-terminaux-android.pdf

C'est à l'aide du menu en haut que vous pourrez regarder le résultat sous différents angles. Décortiquons-le.

On va pour l'instant se concentrer sur la seconde partie du menu, celle avec les 5 menus déroulants.

La première liste déroulante permet de sélectionner un type d'écran. Le chiffre indique la taille de la diagonale enpouces (sachant qu'un pouce fait 2.54 centimètres, la diagonale du Nexus One fait apparemment cm) et la suite de lettres en majuscules qui peut vous sembler totalement aléatoire, la résolution de l'écran. Pour voir àquoi correspondent ces termes en taille réelle, n'hésitez pas à consulter cette image chipée sur Wikipédia .La seconde permet d'observer le comportement en mode portrait ou en mode paysage.La troisième permet d'observer le comportement quand le périphérique est associé à un matériel d’amarrage. Dans lamajorité des cas il ne nous servira pas, d'ailleurs je n'ai même pas présenté le quantificateur adéquat.La quatrième permet d'observer le comportement en fonction de la période de la journée dans laquelle on se trouve.Encore une fois, peu d'applications changent de mise en page en fonction de l'heure.La dernière liste permet de choisir un thème. Nous aborderons plus tard les thèmes et les styles.

Maintenant occupons-nous de la première partie.

Le premier menu déroulant reste vide si vous n'avez pas précisé de mise en page particulière pour certaines langues. Ilvous faudra par exemple créer un répertoire « res/layout-en » pour pouvoir choisir cette option.Le second menu vous permet d'avoir un aperçu de votre interface en fonction de la version de l'API qui sera utilisée.Le dernier menu enfin vous permet de créer un nouveau répertoire en fonction de certains critères, mais je préfèreutiliser l'outil présenté dans le chapitre précédent.

Rien, jamais rien ne remplacera un test sur un vrai terminal. Ne pensez pas que parce votre interface graphique estesthétique dans cet outil, qu'elle le sera aussi en vrai. Si vous n'avez pas de terminal, l'émulateur vous donnera déjàun meilleur aperçu de la situation.

Pour accéder au fichier XML, cliquez sur le second onglet « main.xml » .

Partie 1 : Les bases indispensables à toutes applications 51/89

www.siteduzero.com

Page 53: 554364-developpement-d-applications-pour-terminaux-android.pdf

Règles générales sur les vuesDifférenciation entre un layout et un widget

Eclipse vous a certainement créé un fichier XML de ce tonneau la :Code : XML

<?xml version="1.0" encoding="utf-8"?><LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" ><TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/hello" /></LinearLayout>

On trouve d'abord une racine qui s'appelle LinearLayout. Vous voyez qu'elle englobe un autre nœud qui s'appelle luiTextView, ah ça vous connaissez tiens. Comme indiqué précédemment, une interface graphique pour Android est constituéeuniquement de vues, et ces vues peuvent détenir d'autres contenus sous forme de ressources. Ainsi, tous les nœuds de ce fichierXML seront des vues. Revenons à la première vue qui en englobe une autre. Avec Swing vous avez déjà rencontré ces objetsgraphiques qui englobent d'autres objets graphiques. On les appelle en anglais des layouts et en français des gabarits.

Un layout est donc une vue spéciale qui peut contenir d'autres vues et qui n'est pas destinée à fournir du contenu à l'utilisateur.Le layout se contente de disposer les vues en un certain motif. Les vues contenues sont les enfants, la vue englobante est leparent, comme en XML. Une vue qui ne peut pas en englober d'autres est appelée un widget (« composant » en français).

Un layout hérite de ViewGroup (classe abstraite, qu'on ne peut instancier donc), et ViewGroup hérite de View. Doncquand je dis qu'un ViewGroup peut contenir des View, c'est qu'il peut aussi contenir d'autres ViewGroup.

Vous pouvez très bien avoir en racine un simple widget si vous souhaitez que votre mise en page consiste en cet uniquewidget. La racine possède un attribut qui sera toujours « xmlns:android="http://schemas.android.com/apk/res/android" ».Cette ligne permet de préciser qu'il s'agit d'un document XML utilisable par Android. Si vous ne la mettez pas, Eclipse vousgrondera et refusera de compiler.

Attributs en commun

Toutes les vues ont plusieurs attributs en commun. Les deux attributs les plus communs sont « layout_width », qui définit lalargeur que prend la vue (donc sur l'axe horizontal), et « layout_height », qui définit la hauteur qu'elle prend (donc sur l'axevertical). On peut mettre trois valeurs à ces attributs :

« fill_parent » signifie qu'elle prendra autant de place que son parent sur l'axe concerné. Si elle n'a pas de parent, elleprendra toute la taille de l'activité.« wrap_content » signifie qu'elle prendra le moins de place possible sur l'axe concerné. Par exemple si votre vueaffiche une image, elle prendra à peine la taille de l'image.Une valeur numérique précise avec une unité.

Je vous conseille de ne retenir que deux unités:

« dp » ou « dip » : il s'agit d'une unité qui est indépendante de la résolution de l'écran. En effet, il existed'autres unités comme le pixel (px) ou le millimètre (mm), mais celles-ci varient d'un écran à l'autre...Par exemple si vous mettez une taille de « 500 dp » pour un widget, il aura toujours la même dimensionrelativement à la taille de l'écran. Il sera grand pour un écran avec une grande résolution, et grand pour unécran avec une petite résolution.Si vous mettez une dimension de 500 millimètres (« 500mm ») pour un widget, il sera grand pour un grandécran... et ÉNORME pour un petit écran.« sp »: cette unité respecte le même principe, sauf qu'elle est plus adaptée aux polices de caractères. Il vautmieux l'utiliser pour définir la taille d'une police.

Depuis l'API 8 (dans ce cours on travaille sur l'API 7), il faut remplacer « fill_parent » par « match_parent ». Il s'agit

Partie 1 : Les bases indispensables à toutes applications 52/89

www.siteduzero.com

Page 54: 554364-developpement-d-applications-pour-terminaux-android.pdf

d'exactement la même chose, mais en plus explicite.

Vous pouvez aussi définir une marge internepour chaque widget, autrement ditl'espacement entre le contour de la vue et soncontenu.

Avec l'attribut « android:padding »dans le fichier XML pour définir uncarré d'espacement. La valeur serasuivie d'une unité, 10.5dp parexemple.La méthode java équivalente estpublic void setPadding(int espacement_de_gauche,int espacement_du_dessus,int espacement_de_droite,intespacement_du_dessous).En XML on peut aussi utiliser desattributs « android:paddingBottom »pour définir uniquement l'espacement avec le plancher, « android:paddingLeft » pour définir uniquementl'espacement entre le bord gauche du widget et le contenu, « android:paddingRight » pour définir uniquementl'espacement de droite et enfin « android:paddingTop » pour définir uniquement l'espacement avec le plafond.

Identification

Vous vous rappelez certainement qu'on a dit que certaines ressources avaient un identifiant. Il est possible d'accéder à uneressource à partir de son identifiant à l'aide de la syntaxe « @X/Y ». Le « @ » signifie qu'on accède à un attribut. Le « X » estla classe où se situe l'identifiant dans « R.java ». Enfin, le « Y » sera le nom de l'identifiant. Bien sûr, la combinaison « X/Y »doit pointer sur un identifiant qui existe. Si on reprend notre classe créée par défaut :

Code : XML

<?xml version="1.0" encoding="utf-8"?><LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" ><TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/hello" /></LinearLayout>

On devine d'après la ligne 10 que le TextView affichera le texte de la ressource qui se trouve dans la classe string de « R.java» et qui s'appelle « hello ». Enfin, vous vous rappelez certainement aussi que l'on a récupéré des ressources à l'aide del'identifiant que le fichier « R.java » créait automatiquement dans le chapitre précédent. Si vous allez voir ce fichier, vousconstaterez qu'il ne contient aucune mention à nos vues, juste au fichier main.xml. Et bien c'est tout simplement parce qu'ilfaut créer cet identifiant nous-même (dans le fichier XML, ne modifiez jamais R.java par vous-même malheureux).

On peut rajouter à chaque vue un attribut « android:id ». La valeur doit être de la forme « @+X/Y ». Le « + » signifie qu'onparle d'un attribut qui n'est pas encore défini. En voyant cela, Android sait qu'il doit créer un attribut ou aller le chercher dansles enfants de la vue concernée, puisque l'identifiant du parent est créé avant celui de ses enfants, si on veut faire référence à unenfant dans le parent il faudra utiliser la syntaxe « @+X/Y ».

Dans notre cas, il s'agit d'une création. Le « X » est la classe dans laquelle sera créé l'identifiant. Cette classe peut ne pasexister, elle sera créée. Traditionnellement, « X » vaut « id », mais donnez-lui la valeur qui vous plait. Enfin, le « Y » sera lenom de l'identifiant. Cet identifiant doit être unique au sein d'une même classe, comme d'habitude.

Par exemple, j'ai décidé d'appeler mon TextView « ganbare » et de lui donner un padding de 25.7dp, ce qui nous donne :Code : XML

Partie 1 : Les bases indispensables à toutes applications 53/89

www.siteduzero.com

Page 55: 554364-developpement-d-applications-pour-terminaux-android.pdf

<?xml version="1.0" encoding="utf-8"?><LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" ><TextViewandroid:id="@+id/ganbare"android:padding="25.7dp" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/hello" /></LinearLayout>

Et mon fichier R a été modifié automatiquement en conséquence :Code : Java

public final class R { public static final class attr { } public static final class drawable { public static final int icon=0x7f020000; public static final int truc=0x7f020001; }public static final class id {public static final int ganbare=0x7f050000;} public static final class layout { public static final int main=0x7f030000; } public static final class string { public static final int app_name=0x7f040002; public static final int hello=0x7f040000; public static final int histoire=0x7f040001; }}

Enfin, on peut utiliser cet identifiant dans le code, comme avec les autres identifiants. Pour cela, on utilise la méthodepublic View findViewById (int identifiant_de_la_vue), sauf que cette méthode renvoie une View, ilfaut donc la caster dans le type de View de destination.

Code : Java

public class TroimsActivity extends Activity { TextView monTexte = null; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); monTexte = (TextView)findViewById(R.id.ganbare);monTexte.setText("Gambette"); }}

Je peux tout à fait modifier le padding à postériori.Code : Java

public class TroimsActivity extends Activity { TextView monTexte = null; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);

Partie 1 : Les bases indispensables à toutes applications 54/89

www.siteduzero.com

Page 56: 554364-developpement-d-applications-pour-terminaux-android.pdf

setContentView(R.layout.main); monTexte = (TextView)findViewById(R.id.ganbare); //N'oubliez pas que cette fonction n'utilise que des entiersmonTexte.setPadding(50, 60, 70, 90); }}

Il y a-t-il une raison pour laquelle on accède à la vue après le setContentView() ?

Oui ! Essayez de le faire avant. Votre application va planter.

En fait, à chaque fois qu'on récupère un objet depuis un fichier XML dans notre code Java, on procède à une opération quis'appelle la désérialisation. C'est à ça que sert la fonction public View findViewById (int identifiant). Leproblème est que cette méthode va aller chercher dans l'arbre des vues que l'activité va créer. Or, cet arbre ne sera créé qu'aprèsle setContentView ! Donc le findViewById retournera null puisque l'arbre n'existera pas et l'objet ne sera donc pas dans l'arbre.On va à la place utiliser la méthode public static View inflate (Context notre_activite, intressource_a_recuperer, ViewGroup parent_de_la_ressource). Cette méthode va inflate (désérialiser)l'arbre XML au lieu de l'arbre de vues qui est créé par l'activité.

On aurait aussi pu procéder comme dans le chapitre précédent en utilisant le gestionnaire de ressources pourrécupérer le fichier XML du layout puis le parcourir pour récupérer la bonne vue... Mais sincèrement, ça aurait étébeaucoup d'investissement pour pas grand chose .

Code : Java

public class Main extends Activity { LinearLayout layout = null; TextView text = null; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); layout = (LinearLayout) LinearLayout.inflate(this, R.layout.main,null); //Puis on récupère le premier enfanttext = (TextView) layout.getChildAt(0); text.setText("Et cette fois, ça fonctionne !"); setContentView(layout); }}

Héhé moi je suis plus malin ! Je vais faire comme ça:Code : Java

public class Main extends Activity { TextView text = null; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); text = (TextView) findViewById(R.id.ganbare);text.setText("Aucun problème, je suis malin !"); setContentView(text); }}

Comme ça, l'arbre sera construit et je n'aurai pas à utiliser la méthode bizarre !

Partie 1 : Les bases indispensables à toutes applications 55/89

www.siteduzero.com

Page 57: 554364-developpement-d-applications-pour-terminaux-android.pdf

Ben non . Vous avez oublié l'optimisation mon cher ami.

Un fichier XML est très lourd à parcourir, donc construire un arbre de vues prend du temps et des ressources. A la compilation,si on détecte qu'il y a deux setContentView dans onCreate, et bien on ne prendra en compte que la dernière ! De toute façoncelle d'avant n'aura absolument aucun effet, si ce n'est nous faire perdre du temps pour rien.

Partie 1 : Les bases indispensables à toutes applications 56/89

www.siteduzero.com

Page 58: 554364-developpement-d-applications-pour-terminaux-android.pdf

Les widgets les plus simplesPour chaque widget, son nom est aussi le nom de sa classe Java. De plus, on trouve des attributs qu'on peut utiliser en XML ouen Java. Pour faciliter la lecture et les retrouver facilement, une liste d'éléments choisis peut se trouver en annexe.

Widget Description Image

TextView

Vous connaissez déjà cette vue. Elle vous permet d'afficher une chaîne decaractères. Vous verrez plus tard qu'on peut aussi y insérer des chaînes decaractères formatées, à l'aide de balises HTML, ce qui nous servira à souligner dutexte ou à le mettre en gras par exemple.

EditText

Ce composant-ci est utilisé pour permettre à l'utilisateur d'écrire des textes. Ils'agit en fait d'un TextView éditable.

Il hérite de TextView, on peut donc lui mettre tous les attributs deTextView.

Button

Un simple bouton. Il s'agit en fait d'un TextView cliquable.

Il hérite de TextView, on peut donc lui mettre tous les attributs deTextView.

RadioButton

Un bouton radio en français. Même principe que la CheckBox, peut être dansdeux états, cochée ou non. Il est plutôt recommandé de les regrouper à plusieursdans un « RadioGroup ».

Il hérite de Button, on peut donc lui mettre tous les attributs de Button.-

RadioGroup

Ca vous paraitra évident maintenant mais un « RadioGroup » est un composantqui contient plusieurs RadioButton. En fait, dans un groupe RadioButton, il n'estcensé en avoir qu'un seul qui est activé en même temps. Le RadioGroup fait ensorte que ce postulat soit respecté.

Un « RadioGroup » peut contenir plusieurs « RadioButton » ? Maisc'est un layout alors, pas un composant !

Tout à fait ! On le voit maintenant parce qu'il nous servira qu'avec les «RadioButton ».

CheckBox

Une case à cocher en français. Elle aussi peut être dans deux états : cochée oupas. Contrairement aux RadioButton, elles n'existent pas en tant que groupe, onpeut en avoir plusieurs de cochées en même temps.

Il hérite de Button, on peut donc lui mettre tous les attributs de Button.

Application de calcul de l'IMC (partie 1)

Énoncé

On va commencer un petit TP. Vous voyez ce que c'est l'IMC ? C'est un nombre qui se calcule à partir de la taille et de la massecorporelle d'un individu, afin qu'il puisse déterminer s'il est trop svelte ou trop corpulent.

Ayant travaillé dans le milieu médical, je peux vous affirmer qu'il ne faut pas faire trop confiance à ce chiffre (c'estpourquoi je ne propose pas d'interprétation du résultat pour ce mini-TP). S'il vous indique que vous êtes en surpoids,ne complexez pas ! Sachez que tous les bodybuilders du monde se trouvent en obésité morbide d'après ce chiffre.

Pour l'instant, on va se contenter de faire l'interface graphique.Résultat attendu

Partie 1 : Les bases indispensables à toutes applications 57/89

www.siteduzero.com

Page 59: 554364-developpement-d-applications-pour-terminaux-android.pdf

Instructions

On utilisera uniquement le XML.Pour mettre plusieurs composants dans un layout, on se contentera de mettre les composants entre les balises de celayout. Voici le layout de base :

Code : XML

<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical">

<!-- mettre les composants là -->

</LinearLayout>

On n'utilisera qu'un seul layout.Les TextView qui affichent « Poids : » et « Taille : » sont centrés, en rouge et en gras.Pour mettre un TextView en gras on utilisera l'attribut « android:textStyle » et on lui met comme valeur « bold ».Pour mettre un TextView en rouge on utilisera l'attribut « android:textColor » et on lui met comme valeur «#FF0000" ». Vous pourrez trouver d'autres valeurs pour indiquer une couleur à cet endroit.

Solution

Secret (cliquez pour afficher)

Code : XML

<?xml version="1.0" encoding="utf-8"?><LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical"> <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="Poids : " android:textStyle="bold" android:textColor="#FF0000"

Partie 1 : Les bases indispensables à toutes applications 58/89

www.siteduzero.com

Page 60: 554364-developpement-d-applications-pour-terminaux-android.pdf

android:gravity="center" /> <EditText android:id="@+id/poids" android:layout_width="fill_parent" android:layout_height="wrap_content" android:hint="Poids" android:inputType="numberDecimal" /> <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="Taille : " android:textStyle="bold" android:textColor="#FF0000" android:gravity="center" /> <EditText android:id="@+id/taille" android:layout_width="fill_parent" android:layout_height="wrap_content" android:hint="Taille" android:inputType="numberDecimal" /> <RadioGroup android:id="@+id/group" android:layout_width="wrap_content" android:layout_height="wrap_content" android:checkedButton="@+id/radio2" android:orientation="horizontal" > <RadioButton android:id="@+id/radio1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Mètre" /> <RadioButton android:id="@+id/radio2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Centimètre" /> </RadioGroup> <CheckBox android:id="@+id/mega" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Mega fonction !" /> <Button android:id="@+id/calcul" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Calculer l'IMC" /> <Button android:id="@+id/raz" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="RAZ" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Résultat:" /> <TextView android:id="@+id/result" android:layout_width="fill_parent" android:layout_height="fill_parent" android:text="Vous devez cliquer sur le bouton « Calculerl'IMC » pour obtenir un résultat." /></LinearLayout>

Partie 1 : Les bases indispensables à toutes applications 59/89

www.siteduzero.com

Page 61: 554364-developpement-d-applications-pour-terminaux-android.pdf

C'est très laid, j'admets ! En plus les boutons ne font rien du tout .

Allez, on va remédier à ces deux problèmes.

Partie 1 : Les bases indispensables à toutes applications 60/89

www.siteduzero.com

Page 62: 554364-developpement-d-applications-pour-terminaux-android.pdf

Les évènementsOn va voir ici comment gérer les interactions entre l'interface graphique et l'utilisateur.

Par héritage

On va commencer par la méthode qu'a utilisé cysboy dans son cours. On va faire implémenter un listener à notre classe, ce quiveut dire que notre classe sera une classe à l'écoute des actions qu'on effectuera sur les vues. A chaque fois qu'on effectuera uneaction, une méthode qui correspond à cette action sera appelée, et on définira dans cette méthode ce qu'il faut faire une foisl'action effectuée.

Il existe plusieurs interfaces, une pour chaque type d'actions, nous allons voir uniquement le clic normal pour l'instant.Uniquement des méthodes relatives aux cliques pourront être implémentées.

Je vous ai déjà parlé de focus, c'est un concept dont on parle souvent dans le cas de l'informatique événementielle. Unfocus est quand le programme se concentre sur un élément suite à un stimuli de l'utilisateur. Par exemple si vousfaites tabulation là maintenant, vous verrez différents éléments être sélectionnés dans votre navigateur, c'est qu'ilsrécupèrent le focus.

L'interface utilisée s'appelle View.OnClickListener et nous oblige à définir la méthode void onClick (Viewvue). C'est dans cette méthode qu'on définira la conduite à adopter en cas de clic. L'argument de type View est la vue surlaquelle le clic a été effectué.

Il existe d'autres interfaces avec d'autres méthodes à implémenter :

View.OnLongClickListener pour les longs clics, avec la méthode boolean onLongClick(Viewvue_sur_laquelle_a_ete_lance_l_evenement). Cette méthode doit retourner true une fois que l'actionassociée a été effectuée.View.OnKeyListener pour gérer l'appui de touches. On y associe la méthode boolean onKey (Viewvue_sur_laquelle_a_ete_lance_l_evenement, int code_de_la_touche_pressee,KeyEvent informations_sur_l_evenement). Cette méthode doit retourner true une fois que l'actionassociée a été effectuée.View.OnTouchListener correspond à une simple touche qui s'effectue sur l'élément. On observe notamment unetouche au moment d'un clique puis au moment du relâchement. Rester appuyé après un clic est toujours une touche,même si on sort de l'élément. Est associée la méthode boolean onTouch (Viewvue_sur_laquelle_a_ete_lance_l_evenement, MotionEventinformations_sur_l_evenement). Cette méthode doit retourner true une fois que l'action associée a étéeffectuée.

Un exemple d'implémentation :Code : Java

public class Main extends Activity implements View.OnTouchListener,View.OnClickListener{ Button b = null; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); b = (Button) findViewById(R.id.boutton); b.setOnTouchListener(this); b.setOnClickListener(this); }

@Override public boolean onTouch(View v, MotionEvent event) { /* réagir au toucher */ return true; }

@Override public void onClick(View v) { /* réagir au clic */ }}

Partie 1 : Les bases indispensables à toutes applications 61/89

www.siteduzero.com

Page 63: 554364-developpement-d-applications-pour-terminaux-android.pdf

Et comment réagir si on a plusieurs boutons et qu'ils doivent effectuer des actions différentes ? On peut par exemple passer parun switch pour savoir comment réagir en fonction du bouton:

Code : Java

public void onClick(View v) { switch(v.getId()) { //Si l'identifiant de la vue est celui du premier bouton case R.id.bouton1: /* agir pour bouton 1 */ break; //Si l'identifiant de la vue est celui du second bouton case R.id.bouton2: /* agir pour bouton 2 */ break; /* etc. */ }}

Par un attribut

Un peu plus cocasse, mais permet d'avoir un listener différent pour chaque bouton. C'est la méthode que je privilégie dès quej'ai plusieurs boutons.

Code : Java

public class Main extends Activity{ private OnClickListener clickListenerBoutons = newOnClickListener() { @Override public void onClick(View v) { /* réagir au clic pour les boutons 1 et 2*/ } }; private OnTouchListener touchListenerBouton1 = newOnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { /* réagir au toucher pour le bouton 1*/ return false; } }; private OnTouchListener touchListenerBouton3 = newOnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { /* réagir au toucher pour le bouton 3*/ return false; } }; Button b = null; Button b2 = null; Button b3 = null; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); b = (Button) findViewById(R.id.boutton); b.setOnTouchListener(touchListenerBouton1); b.setOnClickListener(clickListenerBoutons); b2.setOnClickListener(clickListenerBoutons); b3.setOnTouchListener(touchListenerBouton3); }}

Partie 1 : Les bases indispensables à toutes applications 62/89

www.siteduzero.com

Page 64: 554364-developpement-d-applications-pour-terminaux-android.pdf

Petit exercice

Énoncé

On va s'amuser un peu. Créez un bouton qui prend tout l'écran et faites en sorte que le texte grossisse quand on s'éloigne ducentre du bouton, et rétrécisse quand on s'en rapproche.

Instructions

Pour changer la taille d'un texte, on utilise la méthode void setTextSize (float taille_du_texte).La taille du texte est déterminée par |Coordonnées_des_abscisses_X - longueur| + |Coordonnées_des_ordonnées_Y -hauteur|. Les deux séparateurs « | » indiquent qu'on chercher la valeur absolue d'une expression mathématique (c'est-à-dire que si la soustraction est négative, elle reverra la valeur positive de cette soustraction. Par exemple |-1| = 1 et |1| =1).Pour obtenir la valeur absolue d'un nombre, on peut utiliser la méthode statique double abs(float a) de laclasse Math.Pour obtenir la coordonnée en abscisse (X) on utilise float getX () du MoveEvent, et pour obtenir lacoordonnée en ordonnée (Y) on utilise float getY ().

Solution

Secret (cliquez pour afficher)

Code : XML

<?xml version="1.0" encoding="utf-8"?><LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <Button android:id="@+id/bouton" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_gravity="center" android:text="@string/hello" /></LinearLayout>

Code : Java

public class Main extends Activity implementsView.OnTouchListener{ Button b = null; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); b = (Button) findViewById(R.id.bouton); b.setOnTouchListener(this); }

@Override public boolean onTouch(View v, MotionEvent event) { Button tmp = (Button)v; tmp.setTextSize(Math.abs(event.getX() - v.getWidth()/2) +Math.abs(event.getY() - v.getHeight()/2)); return true; }}

Partie 1 : Les bases indispensables à toutes applications 63/89

www.siteduzero.com

Page 65: 554364-developpement-d-applications-pour-terminaux-android.pdf

On a procédé par héritage puisqu'on a qu'un seul bouton sur lequel agir.

Application de calcul de l'IMC (partie 2)

Énoncé

On va maintenant relier tous les boutons de notre application pour pouvoir effectuer tous les calculs.

La CheckBox de le megafonction permet de mettre un message élogieux pour l'utilisateur au lieu du calcul.

La formule pour calculer l'IMC est .

Le bouton « RAZ » remet à 0 tous les champs et le texte du résultat par défaut.

Le RadioGroup permet de sélectionner en quelle unité l'utilisateur a indiqué sa taille. Pour obtenir la taille en mètre depuis la

taille en centimètre il suffit de diviser par 100 : .

Dès qu'on change les valeurs dans les champs « Poids » et « Taille », on remet le texte du résultat par défaut puisque la valeurcalculée n'est plus valable pour les nouvelles valeurs.

On enverra un message d'erreur si l'utilisateur essaie de faire le calcul avec une taille = 0 grâce à un « toast ».

Un toast est un widget un peu particulier qui permet d'afficher un message à n'importe quel moment sans avoir à créerde vue. Il est destiné à informer l'utilisateur sans le déranger outre mesure, il n'attire pas l'attention sur lui etl’utilisateur peut continuer à utiliser l'application comme si le toast n'était pas présent.

Consignes

On utilisera la méthode boolean isChecked() qui renvoie true si la CheckBox sur laquelle est utilisée laméthode est sélectionnée.Voici la syntaxe pour construire un toast : static Toast makeText(Contextle_context_d_ou_est_lance_le_toast, CharSequence le_texte_a_afficher, intla_duree_d_affichage). La durée peut être indiquée à l'aide de la constante Toast.LENGTH_SHORT pour unmessage court et Toast.LENGTH_LONG pour un message qui durera plus longtemps.Pour afficher le toast construit, il faut lui appliquer la méthode void show ().Pour récupérer l'identifiant du RadioButton qui est sélectionné dans un RadioGroup il faut utiliser la méthode intgetCheckedRadioButtonId ().On peut récupérer le texte d'un EditText à l'aide de la fonction Editable getText (). On peut ensuite vider lecontenu de cet objet Editable à l'aide de la fonction void clear().

Ma solution

Secret (cliquez pour afficher)

Code : Java

public class TroimsActivity extends Activity { //La chaîne de caractères par défaut private final String defaut = "Vous devez cliquer sur le bouton «Calculer l'IMC » pour obtenir un résultat."; //La châine de caractères de la méga fonction private final String megaString = "Vous faites un poids parfait !Wahou ! Trop fort ! On dirait Brad Pitt (si vous êtes unhommes)/Angelina Jolie (si vous êtes une femme)/Willy (si vousêtes un orque) !"; Button envoyer = null; Button raz = null; EditText poids = null; EditText taille = null;

Partie 1 : Les bases indispensables à toutes applications 64/89

www.siteduzero.com

Page 66: 554364-developpement-d-applications-pour-terminaux-android.pdf

RadioGroup group = null; TextView result = null; CheckBox mega = null; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); //on récupère toutes les vues dont on a besoin envoyer = (Button)findViewById(R.id.calcul); raz = (Button)findViewById(R.id.raz); taille = (EditText)findViewById(R.id.taille); poids = (EditText)findViewById(R.id.poids); mega = (CheckBox)findViewById(R.id.mega); group = (RadioGroup)findViewById(R.id.group); result = (TextView)findViewById(R.id.result); //on attribut un Listener adapté aux vues qui en ont besoin envoyer.setOnClickListener(envoyerListener); raz.setOnClickListener(razListener); taille.setOnKeyListener(modificationListener); poids.setOnKeyListener(modificationListener); mega.setOnClickListener(checkedListener); } //Se lance à chaque touche qui modifie l'élément private OnKeyListener modificationListener = newOnKeyListener() { @Override public boolean onKey(View v, int keyCode, KeyEvent event) { //On remet le texte à sa valeur par défaut result.setText(defaut); return false; } }; //Uniquement pour le bouton envoyer private OnClickListener envoyerListener = new OnClickListener() { @Override public void onClick(View v) { if(!mega.isChecked()) { //Si la mega fonction n'est pas activée String t = taille.getText().toString(); String p = poids.getText().toString(); float pValue = 0; float tValue = 0; float imc = 0; //On vérifie que le champ pour la taille n'est pas vide if(t != null && t.length() > 0) { tValue = Float.valueOf(t); //On vérifie que la taille n'est pas égale à 0 if(tValue == 0) Toast.makeText(TroimsActivity.this, "Tu fais pas 0 cm l'ami,sinon tu pourrais pas tenir un téléphone.",Toast.LENGTH_SHORT).show(); else { //On vérifie que le champ pour le poids n'est pas vide if(p != null && p.length() > 0) pValue = Float.valueOf(p); //Si l'utilisateur a indiqué que la taille était encentimètres if(group.getCheckedRadioButtonId() == R.id.radio2) tValue = tValue / 100; tValue = (float)Math.pow(tValue, 2); imc = pValue / tValue;

Partie 1 : Les bases indispensables à toutes applications 65/89

www.siteduzero.com

Page 67: 554364-developpement-d-applications-pour-terminaux-android.pdf

result.setText("Votre IMC est " + String.valueOf(imc)); } }else Toast.makeText(TroimsActivity.this, "Il faut indiquer unetaille nunuche !", Toast.LENGTH_SHORT).show(); }else result.setText(megaString); } }; //Listener du bouton de remise à zéro private OnClickListener razListener = new OnClickListener() { @Override public void onClick(View v) { poids.getText().clear(); taille.getText().clear(); result.setText(defaut); } }; //Listener du bouton de la mega fonction. private OnClickListener checkedListener = new OnClickListener() { @Override public void onClick(View v) { //On remet le texte par défaut si c'était le texte de la mégafonction qui était écrit if(!((CheckBox)v).isChecked() &&result.getText().equals(megaString)) result.setText(defaut); } };}

Vous avez vu ce qu'on a fait ? Sans toucher à l'interface graphique, on a pu effectuer toutes les modifications nécessaires aubon fonctionnement de notre application. C'est l'intérêt de définir l'intervalle dans un fichier XML et le côté interactif en Java.Vous pouvez modifier l'un sans toucher à l'autre.

Partie 1 : Les bases indispensables à toutes applications 66/89

www.siteduzero.com

Page 68: 554364-developpement-d-applications-pour-terminaux-android.pdf

Les layouts (gabarits)LinearLayout

Comme son nom l'indique, ce layout se charge de mettre les vues sur une même ligne, selon une certaine orientation. L'attributpour préciser cette orientation est « android:orientation ».

On peut lui donner deux valeurs:

« vertical » pour que les composants soient placés de haut en bas.« horizontal » pour que les composants soient placés de gauche à droite.

On va faire quelques expériences pour s'amuser.

Code et explications Résultat

Code : XML

<?xml version="1.0" encoding="utf-8"?><LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" ><Button android:id="@+id/ganbare" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/hello" /> <Button android:id="@+id/lautre" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="En d'ssous" /></LinearLayout>

Le LinearLayout est vertical et prend toute la place de son parent. Comme il n'en a pas, ilprend toute la place de l'activité.Le premier bouton prend toute la place dans le parent en longueur et uniquement lataille nécessaire en hauteur (la taille du texte donc !).Le seconde bouton fait de même.

Code : XML

<?xml version="1.0" encoding="utf-8"?><LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" ><Button android:id="@+id/ganbare" android:layout_width="wrap_content" android:layout_height="fill_parent" android:text="@string/hello" /> <Button android:id="@+id/lautre" android:layout_width="wrap_content" android:layout_height="fill_parent" android:text="En d'ssous" />

Partie 1 : Les bases indispensables à toutes applications 67/89

www.siteduzero.com

Page 69: 554364-developpement-d-applications-pour-terminaux-android.pdf

</LinearLayout>

Le LinearLayout est vertical et prend toute la place de son parent.Le premier bouton prend toute la place de son parent en hauteur et uniquement la taillenécessaire en largeur .Le pauvre seconde bouton se fait écraser par le premier bouton qui prend toute la placepossible . C'est pour ça qu'on ne le voit pas.

Code : XML

<?xml version="1.0" encoding="utf-8"?><LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="wrap_content" android:layout_height="wrap_content" ><Button android:id="@+id/un" android:layout_width="wrap_content" android:layout_height="fill_parent" android:text="Dessus"/> <Button android:id="@+id/deux" android:layout_width="wrap_content" android:layout_height="fill_parent" android:text="Dessous" /></LinearLayout>

Le LinearLayout est vertical et prend toute la place en longueur mais uniquement lataille nécessaire en hauteur. La taille nécessaire est calculée en fonction des enfants.Le premier bouton prend toute la place possible dans le parent. Comme le parent prendle moins de place possible, il doit faire de même.Le seconde bouton fait de même.

Code : XML

<?xml version="1.0" encoding="utf-8"?><LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="fill_parent" ><Button android:id="@+id/ganbare" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/hello" /> <Button android:id="@+id/lautre" android:layout_width="wrap_content" android:layout_height="fill_parent" android:text="En d'ssous" /></LinearLayout>

Le LinearLayout est horizontal et prend toute la place de son parent.Le premier bouton prend uniquement la place nécessaires.

Partie 1 : Les bases indispensables à toutes applications 68/89

www.siteduzero.com

Page 70: 554364-developpement-d-applications-pour-terminaux-android.pdf

Le pauvre seconde bouton prend uniquement la place nécessaire en longueur et s'étendjusqu'aux bords du parent.

Vous remarquerez que l'espace est toujours divisé entre les deux boutons de manière égale. Et si on voulait que le bouton dedroite prenne 2 fois plus de place que celui de gauche ?

Pour cela, il faut attribuer un poids au composant. Ce poids peut être défini grâce à l'attribut « android:layout_weight ». Pourfaire en sorte que le bouton de droite prenne deux fois plus de place, on peut lui mettre android:layout_weight="1" etmettre au bouton de gauche android:layout_weight="2".

C'est le composant qui "pèse" le moins qui a la priorité.

Et si dans l'exemple précédent du tableau où un bouton en écrasait un autre, les deux boutons avaient eu un poids identique,par exemple android:layout_weight="1" pour les deux, ils auraient eu la même priorité et auraient pris la mêmeplace. Par défaut, ce poids est à 0.

Dernier attribut particulier pour les widgets de ce layout, « android:layout_gravity », qu'il ne faut pas confondre avec «android:gravity ». « android:layout_gravity » vous permet de déterminer comment se placera la vue dans le parent, alorsque « android:gravity » vous permet de déterminer comment se placera le contenu de la vue à l'intérieur même de la vue. «android:layout_gravity » prend les même valeurs que « android:gravity ».

Et un petit exemple pour illustrer le fonctionnement:

Code : XML

<?xml version="1.0" encoding="utf-8"?><LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="fill_parent" > <Button android:id="@+id/bouton1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="bottom" android:layout_weight="1" android:text="Bouton 1" /> <Button android:id="@+id/bouton2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:layout_weight="2" android:text="Bouton 2" /> <Button android:id="@+id/bouton3" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="top" android:layout_weight="1" android:text="Bouton 3" /></LinearLayout>

Application de calcul de l'IMC (partie 3.1)

Énoncé

Maintenant mettez votre application en forme pour qu'elle soit un peu plus jolie.Instructions

Essayez d'utiliser le plus d'attributs de LinearLayout possibles.

Partie 1 : Les bases indispensables à toutes applications 69/89

www.siteduzero.com

Page 71: 554364-developpement-d-applications-pour-terminaux-android.pdf

Les EditText prennent le plus de place possible, mais comme ils ont un poids plus fort que les TextView, ilsn'ont pas la priorité.On rajoute des marges aux Button pour des raisons esthétiques.

Ma solution

Secret (cliquez pour afficher)

Code : XML

<?xml version="1.0" encoding="utf-8"?><LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical"> <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="horizontal" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Poids : " android:textStyle="bold" android:textColor="#FF0000" android:gravity="center" /> <EditText android:id="@+id/poids" android:layout_width="fill_parent" android:layout_height="wrap_content" android:hint="Poids" android:inputType="numberDecimal" android:layout_weight="1" /> </LinearLayout> <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="horizontal" > <TextView android:layout_width="wrap_content"

Partie 1 : Les bases indispensables à toutes applications 70/89

www.siteduzero.com

Page 72: 554364-developpement-d-applications-pour-terminaux-android.pdf

android:layout_height="wrap_content" android:text="Taille : " android:textStyle="bold" android:textColor="#FF0000" android:gravity="center" /> <EditText android:id="@+id/taille" android:layout_width="fill_parent" android:layout_height="wrap_content" android:hint="Taille" android:inputType="numberDecimal" android:layout_weight="1" /> </LinearLayout> <RadioGroup android:id="@+id/group" android:layout_width="wrap_content" android:layout_height="wrap_content" android:checkedButton="@+id/radio2" android:orientation="horizontal" > <RadioButton android:id="@+id/radio1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Mètre" /> <RadioButton android:id="@+id/radio2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Centimètre" /> </RadioGroup> <CheckBox android:id="@+id/mega" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Mega fonction !" /> <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <Button android:id="@+id/calcul" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Calculer l'IMC" android:layout_weight="1" android:layout_marginLeft="25dip" android:layout_marginRight="25dip"/> <Button android:id="@+id/raz" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="RAZ" android:layout_weight="1" android:layout_marginLeft="25dip" android:layout_marginRight="25dip"/> </LinearLayout> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Résultat:" /> <TextView android:id="@+id/result" android:layout_width="fill_parent" android:layout_height="fill_parent" android:text="Vous devez cliquer sur le bouton « Calculerl'IMC » pour obtenir un résultat." /></LinearLayout>

Partie 1 : Les bases indispensables à toutes applications 71/89

www.siteduzero.com

Page 73: 554364-developpement-d-applications-pour-terminaux-android.pdf

Le plus gros problème des LinearLayouts, c'est qu'il faut les emboiter. Et plus on emboite de layouts, plus on perd enperformance.

RelativeLayout

De manière totalement différente, ce layout propose plutôt de placer les composants les uns par rapport aux autres, en partantdu premier. En fait, chaque widget, à l'exception du premier, aura un attribut particulier pour qu'on sache où le mettre parrapport à un autre composant.

Application de calcul de l'IMC (partie 3.2)

Même chose pour un layout différent ! Moi, je vise le même résultat que précédemment.Ma solution

Secret (cliquez pour afficher)

Code : XML

<?xml version="1.0" encoding="utf-8"?><RelativeLayoutxmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent"> <TextView android:id="@+id/textPoids" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Poids : " android:textStyle="bold" android:textColor="#FF0000" /> <EditText android:id="@+id/poids" android:layout_width="wrap_content" android:layout_height="wrap_content" android:hint="Poids" android:inputType="numberDecimal" android:layout_toRightOf="@id/textPoids" android:layout_alignParentRight="true" /> <TextView android:id="@+id/textTaille" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Taille : " android:textStyle="bold" android:textColor="#FF0000" android:gravity="left" android:layout_below="@id/poids" /> <EditText android:id="@+id/taille" android:layout_width="wrap_content" android:layout_height="wrap_content" android:hint="Taille" android:inputType="numberDecimal" android:layout_below="@id/poids" android:layout_toRightOf="@id/textTaille" android:layout_alignParentRight="true" /> <RadioGroup android:id="@+id/group" android:layout_width="wrap_content" android:layout_height="wrap_content" android:checkedButton="@+id/radio2" android:orientation="horizontal" android:layout_below="@id/taille" > <RadioButton android:id="@+id/radio1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Mètre" />

Partie 1 : Les bases indispensables à toutes applications 72/89

www.siteduzero.com

Page 74: 554364-developpement-d-applications-pour-terminaux-android.pdf

<RadioButton android:id="@+id/radio2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Centimètre" /> </RadioGroup> <CheckBox android:id="@+id/mega" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Mega fonction !" android:layout_below="@id/group" /> <Button android:id="@+id/calcul" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Calculer l'IMC" android:layout_below="@id/mega" android:layout_marginLeft="25dip"/> <Button android:id="@+id/raz" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="RAZ" android:layout_below="@id/mega" android:layout_alignRight="@id/taille" android:layout_marginRight="25dip"/> <TextView android:id="@+id/resultPre" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Résultat:" android:layout_below="@id/calcul" /> <TextView android:id="@+id/result" android:layout_width="fill_parent" android:layout_height="fill_parent" android:text="Vous devez cliquer sur le bouton « Calculerl'IMC » pour obtenir un résultat." android:layout_below="@id/resultPre" /></RelativeLayout>

Le problème de ce layout, c'est qu'une petite modification dans l'interface graphique peut provoquer de grosses modificationdans tout le fichier XML.

TableLayout

Dernier layout de base, il permet d'organiser les éléments selon un tableau, comme en HTML. Chaque vue est une ligne dutableau, et pour avoir plusieurs éléments sur une même ligne, il faut placer ces vues entre les nœuds<TableRow></TableRow>. Chaque élément qui correspond à une ligne a son attribut android:layout_width à lavaleur fill_parent. Et tous les éléments d'une ligne composée essayent de prendre le moins de place possible en longueur et enhauteur par rapport à l'élément le plus grand de cette colonne. On a donc un wrap_content sur l'élément le plus grand de cettecolonne. Le nombre de colonnes du tableau est le nombre de colonnes de la ligne qui a le plus de colonnes.

Sur le nœud TableLayout, on peut jouer avec trois attributs (attention, les rangs débutent à 0):

android:stretchColumns pour que la longueur de tous les éléments de cette colonne passe en fill_parent, doncpour prendre le plus de place possible. Il faut préciser le rang de la colonne à cibler, ou plusieurs rangs séparés par desvirgules.android:shrinkColumns pour que la longueur de tous les éléments de cette colonne passe en wrap_contentpour le plus petit élément de la colonne, donc pour prendre le moins de place possible. Il faut préciser le rang de lacolonne à cibler, ou plusieurs rangs séparés par des virgules.android:collapseColumns pour faire purement et simplement disparaître des colonnes du tableau. Il fautpréciser le rang de la colonne à cibler, ou plusieurs rangs séparés par des virgules.

On peut définir dans quelle colonne débute une vue avec l'attribut android:layout_column (la première colonne est au

Partie 1 : Les bases indispensables à toutes applications 73/89

www.siteduzero.com

Page 75: 554364-developpement-d-applications-pour-terminaux-android.pdf

rang 0). Si besoin, vous pouvez faire en sorte qu'un élément s'étende sur plusieurs colonnes, comme en HTML, avec l'attributandroid:layout_span.

Par exempleCode : XML

<TableLayoutxmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent"> <TableRow> <TextView android:text="@strings/hello" android:gravity="center"/> <EditText android:layout_span="2" android:layout_column="2"/> </TableRow></TableLayout>

Notre EditText va commencer à la deuxième colonne et s'étendra sur 2 colonnes. Le tableau contient donc 4 colonnes.

Application de calcul de l'IMC (partie 3.3)

Énoncé

C'est reparti pour un tour !Ma solution

Secret (cliquez pour afficher)

Code : XML

<?xml version="1.0" encoding="utf-8"?><TableLayoutxmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:stretchColumns="1"> <TableRow> <TextView android:text="Poids : " android:textStyle="bold" android:textColor="#FF0000" android:gravity="center"/> <EditText android:id="@+id/poids" android:hint="Poids" android:inputType="numberDecimal" android:layout_span="2" /> </TableRow> <TableRow> <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="Taille : " android:textStyle="bold" android:textColor="#FF0000" android:gravity="center" /> <EditText android:id="@+id/taille" android:layout_width="fill_parent" android:layout_height="wrap_content" android:hint="Taille" android:inputType="numberDecimal" android:layout_span="2" /> </TableRow> <RadioGroup android:id="@+id/group"

Partie 1 : Les bases indispensables à toutes applications 74/89

www.siteduzero.com

Page 76: 554364-developpement-d-applications-pour-terminaux-android.pdf

android:layout_width="wrap_content" android:layout_height="wrap_content" android:checkedButton="@+id/radio2" android:orientation="horizontal" > <RadioButton android:id="@+id/radio1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Mètre" /> <RadioButton android:id="@+id/radio2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Centimètre" /> </RadioGroup> <CheckBox android:id="@+id/mega" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Mega fonction !" /> <TableRow> <Button android:id="@+id/calcul" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Calculer l'IMC" /> <Button android:id="@+id/raz" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="RAZ" android:layout_column="2" /> </TableRow> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Résultat:" /> <TextView android:id="@+id/result" android:layout_width="fill_parent" android:layout_height="fill_parent" android:text="Vous devez cliquer sur le bouton « Calculerl'IMC » pour obtenir un résultat." /></TableLayout>

FrameLayout

Ce layout est plutôt utilisé pour afficher une unique vue. Il peut sembler inutile comme ça mais ne l'est pas du tout ! Ce layoutn'est destiné à afficher qu'un élément, mais il est possible d'en mettre plusieurs dedans puisqu'il s'agit d'un ViewGroup. Si parexemple vous souhaitez faire un album photo, il vous suffit de mettre plusieurs éléments dans le FrameLayout et de ne laisserqu'une seule photo en visible, et de laisser les autres en invisible avec l'aide de l'attribut « android:visibility » (cet attribut estdisponible pour toutes les vues). Il peut prendre trois valeurs :

« visible » (View.VISIBLE) la valeur par défaut.« invisible » (View.INVISIBLE) ne s'affiche pas mais est pris en compte pour l'affichage du layout niveau spatial (onlui réserve de la place).« gone » (View.GONE) ne s'affiche pas et ne prend pas de place. En fait on fait comme s'il n'était pas là.

L'équivalent java de cet attribut est public void setVisibility (int) avec comme paramètre une des valeurs entreparenthèses dans la liste ci-dessus. Quand il y a plusieurs éléments dans un FrameLayout, il les empile les uns au-dessus desautres, avec le premier élément du XML qui se trouve en dernière position, et le dernier ajouté se trouve tout au-dessus.

Vous l'aurez compris vous-même, on a vu ici que les composants les plus basiques, les plus simples... et aussi les plus

Partie 1 : Les bases indispensables à toutes applications 75/89

www.siteduzero.com

Page 77: 554364-developpement-d-applications-pour-terminaux-android.pdf

primordiaux. Vous êtes presque certains de les utiliser quasi-constamment. Le prochain chapitre présentera d'autrescomposants, plus complexes peut-être, moins fondamentaux certainement, mais aussi qui vous permettront d'exploiter toutesles possibilités d'Android dans ce domaine.

Partie 2 : Annexes 76/89

www.siteduzero.com

Page 78: 554364-developpement-d-applications-pour-terminaux-android.pdf

Partie 2 : Annexes

L'architecture d'AndroidAprès quelques réflexions et quelques recherches, je me suis dit que c'était peut-être une bonne idée de présenter aux pluscurieux l'architecture d'Android. Vous pouvez considérer ce chapitre comme facultatif s'il vous ennuie ou vous semble tropcompliqué, vous serez tout de même capable de développer correctement sous Android mais un peu de culture technique nepeut pas vous faire de mal .

Concrètement, l'architecture d'Android, c'est ça :

Schéma qui provient de la page suivante, provenant du site d'Android destiné aux développeurs.

En soi, ce schéma est incompréhensible et franchement pas glamour, mais il résume de manière concrète ce que je vais vousraconter. Ce que vous observez est une pile des composants qui constituent le système d'exploitation. Le sens de lecture se faitde bas en haut, puisque le composant de plus bas niveau est le noyau linux et celui de plus haut niveau sont les applications.

Partie 2 : Annexes 77/89

www.siteduzero.com

Page 79: 554364-developpement-d-applications-pour-terminaux-android.pdf

Le noyau LinuxJe vous avais déjà dit que le système d'exploitation d'Android se basait sur Linux. Si on veut être plus précis, c'est le noyau («kernel » en anglais) de Linux qui est utilisé. Le noyau est l'élément du système d'exploitation qui permet de faire le pont entrele matériel et le logiciel. Par exemple les pilotes Wifi permettent de contrôler la puce Wifi. Quand Android veut activer lapuce Wifi, on peut imaginer qu'il utilise la fonction « allumerWifi() », et c'est au constructeur de spécifier le comportement de« allumerWifi() » pour sa puce. On aura donc une fonction unique pour toutes les puces, mais le contenu de la fonction seraunique pour chaque matériel.

La version du noyau utilisée avec Android est une version conçue spécialement pour l'environnement mobile, avec unegestion avancée de la batterie et une gestion particulière de la mémoire. C'est cette couche qui fait en sorte qu'Android soitcompatible avec tant de supports différents.

Ça ne signifie pas qu'Android est une distribution de Linux, il a le même coeur mais c'est tout. Vous ne pourrez paslancer d'applications destinées à GNU/Linux sans passer par de petites manipulations, mais si vous êtes bricoleur...

Si vous regardez attentivement le schéma, vous remarquerez que cette couche est la seule qui gère le matériel. Android en soine s'occupe pas de ce genre de détails. Je ne veux pas dire par là qu'il n'y a pas d'interactions entre Android et le matériel, justeque quand un constructeur veut ajouter un matériel qui n'est pas pris en compte par défaut par Android, il doit travailler sur lekernel et non sur les couches au-dessus, qui sont des couches spécifiques à Android.

Partie 2 : Annexes 78/89

www.siteduzero.com

Page 80: 554364-developpement-d-applications-pour-terminaux-android.pdf

Les bibliothèques pour AndroidCes bibliothèques proviennent de beaucoup de projets open-sources, écris en C/C++ pour la plupart, comme SQLite pour lesbases de données, WebKit pour la navigation web ou encore OpenGL afin de produire des graphismes en 2D ou en 3D. Vousallez me dire qu'Android ne peut pas utiliser ces bibliothèques puisqu'elles ne sont pas en Java, cependant vous auriez tortpuisqu'Android comprend très bien le C et le C++ !

Partie 2 : Annexes 79/89

www.siteduzero.com

Page 81: 554364-developpement-d-applications-pour-terminaux-android.pdf

Le moteur d'exécution AndroidC'est cette couche qui fait qu'Android n'est pas qu'une simple « implémentation de Linux pour portables ». Elle contientcertaines bibliothèques de base du Java accompagnées de bibliothèques spécifiques à Android et la machine virtuelle «Dalvik ».

Un moteur d'exécution (« runtime system » en anglais) est un programme qui permet l’exécution d'autresprogrammes. Vous savez peut-être que pour utiliser des applications développées en Java sur votre ordinateur vousavez besoin du JRE (« Java RUNTIME Environment »), et bien il s'agit du moteur d'exécution nécessaire pourlancer des applications écrites en Java.

Voici un schéma qui indique les étapes nécessaires à la compilation et à l’exécution d'un programme Java standard :

Votre code est une suite d'instructions que l'on trouve dans un fichier « .java » et ce fichier sera traduit en une autre suited'instructions dans un autre langage que l'on appelle le « bytecode ». Ce code est contenu dans un fichier « .class ». Lebytecode est un langage spécial qu'une machine virtuelle Java peut comprendre et interpréter. Les différents fichiers « .class »sont ensuite regroupés dans un « .jar » et c'est ce fichier qui est exécutable. En ce qui concerne Android, la procédure estdifférente. En fait ce que vous appelez Java est certainement une variante particulière de Java qui s'appelle « Java SE ». Or,pour développer des applications pour Android, on n'utilise pas vraiment Java SE. Pour ceux qui savent ce qu'est « Jave ME», ce n'est pas non plus ce framework que l'on utilise (Java ME est une version spéciale de Java destinée au développementmobile, mais pas pour Android donc).

A noter que sur le schéma le JDK et le JRE sont réunis, mais il est possible de télécharger le JRE sans télécharger le JDK.

La version de Java qui permet le développement Android est une version réduite amputée de certaines fonctionnalités quin'ont rien à faire dans un environnement mobile. Par exemple, la bibliothèque graphique Swing n'est pas supportée, on trouveà la place un système beaucoup plus adapté. Mais Android n'utilise pas une machine virtuelle Java ; une machine virtuelletoute étudiée pour les systèmes embarqués a été développée, et elle s'appelle « Dalvik ». Cette machine virtuelle est optimiséepour mieux gérer les ressources physiques du système. Je citerai par exemple qu'elle permet de laisser moins d'empreintemémoire (la quantité de mémoire allouée à une application pendant son exécution) et qu'elle puise moins dans la batteriequ'une machine virtuelle Java.

La plus grosse caractéristique de Dalvik est qu'elle permet d'instancier (terme technique qui signifie « créer une occurrence de». Par exemple quand vous créez un objet en java, on instancie une classe puisqu'on crée une occurrence de cette classe) unnombre très important d'occurrences de lui-même : chaque programme a sa propre occurrence de Dalvik et elles peuvent vivresans se perturber les unes les autres. Voici un schéma qui indique les étapes nécessaires à la compilation et à l’exécution d'unprogramme Android standard :

Partie 2 : Annexes 80/89

www.siteduzero.com

Page 82: 554364-developpement-d-applications-pour-terminaux-android.pdf

On voit bien que le code Java est ensuite converti en bytecode Java comme auparavant. Mais souvenez-vous, je vous ai ditque le bytecode Java ne pouvait être lu que par une machine virtuelle Java, et je vous ai aussi dit que Dalvik n'était PAS unemachine virtuelle Java. Il faut donc procéder à une autre conversion à l'aide d'un programme qui s'appelle « dx ». Ceprogramme s'occupera de traduire les applications de bytecode Java en bytecode Dalvik, qui lui est compréhensible par lamachine virtuelle.

La puissante machine virtuelle Dalvik est destiné uniquement à Android, mais il est possible de développer unemachine virtuelle similaire et qui ne fonctionne pas sous Android. Par exemple, le Nokia N9 pourra exécuter desapplications Android sans utiliser ce système.

Partie 2 : Annexes 81/89

www.siteduzero.com

Page 83: 554364-developpement-d-applications-pour-terminaux-android.pdf

Les frameworks pour les applicationsIl s'agit d'un framework qui...

Un quoi??

Un framework peut se traduire littéralement par un cadre de travail. Il s'agit d'un ensemble de composants qui définissent lesfondations ainsi que les grandes lignes directrices de l'organisation d'un code, en d'autres termes on peut parler de sonarchitecture ou de son squelette. Un framework prodigue aussi quelques fonctionnalités de base (accès à la base de donnéespar exemple). Cet outil fournit ainsi une démarcation radicale entre plusieurs aspects d'un programme et permet de mieuxdiviser les tâches (toi tu fais l'interface graphique, toi l'interaction avec le réseau, etc).

En fait ce sont ces frameworks là qui vous sont disponibles quand vous programmez en Java, et qui s'occupent d'interagir avecla bibliothèque Android. Vous pouvez vous contenter d'appeler des fonctions déjà faites à l'avance par d'autres et les regarders'exécuter tranquillement.

Partie 2 : Annexes 82/89

www.siteduzero.com

Page 84: 554364-developpement-d-applications-pour-terminaux-android.pdf

Les applicationsIl s'agit tout simplement d'un ensemble d'applications que l'on peut trouver sur Android, par exemple les fonctionnalités debase inclues un client pour recevoir/envoyer des emails, un programme pour envoyer/recevoir des SMS, un calendrier, unrépertoire, etc. C'est ici que vous intervenez, cette stèle est celle de vos futures applications développées en Java. Vous l'aurezcompris, vous accédez aux mêmes ressources que les applications fournies par défaut, vous avez donc autant de possibilitésqu'elles, vous avez même la possibilité de les remplacer. C'est aussi ça la force d'Android.

Attributs et méthodes des vuesVous trouverez ici une liste des attributs choisis pour la manipulation des vues. Cette liste n'est pas exhaustive bien entendu,je n'ai pas pour vocation de traduire intégralement la très longue documentation d'Android.

Pour chaque tableau de cette section, on respectera la convention suivante :

La première colonne est le nom de l'attribut qu'il est possible d'utiliser dans le fichier XML.La seconde colonne donne l'éventail de valeurs que vous pouvez mettre dans le fichier XML. Si vous voyez la mention« Cumulable », c'est qu'il est possible de mettre plusieurs attributs à la suite à l'aide du séparateur « | ». Exemple avecles attributs « X », « Y » et « Z » : « X | Z | Y ». L'ordre importe peu.La troisième colonne donne la méthode Java équivalente si elle existe.Et la dernière colonne donne les valeurs qu'on peut utiliser avec la méthode Java.

Partie 2 : Annexes 83/89

www.siteduzero.com

Page 85: 554364-developpement-d-applications-pour-terminaux-android.pdf

TextViewAttribut Description Valeur XML et effet Équivalent Java Valeur Java

android:autoLink

Permet àAndroid dedétecter laprésence demotifsparticuliersdans letexte, et derendre lesmotifscliquables.Parexemplecliquer surun numérodetéléphonepermet del'appeler etcliquer surun lienpermetd'accéderau site.

Cumulable.

none pour ne pasl'activer.web pour les siteswebs.email pour lesadresses emails.phone pour lesnuméros detéléphone.map pour lescartes.all pour toutchoisir.

setAutoLinkMask(int)

0Linkify.WEB_URLSLinkify.EMAIL_ADDRESSESLinkify.PHONE_NUMBERSLinkify.MAP_ADDRESSESLinkify.All

android:gravity

Détermineoù doit seplacer letexte dansle widget.

Cumulable.

top pour qu'il semette en haut.bottom pour qu'ilse mette en bas.left pour qu'il semette à gauche.right pour qu'il semette à droite.center pour qu'ilau centre.center_horizontalpour quelle semette au centre del'axe horizontal.center_verticalpour qu'il se metteau centre de l'axevertical.fill pour que letexte s'étire etremplisse tout lecomposant.fill_horizontalpour que le textes'étire et remplissetout le composantsur l'axehorizontal.fill_vertical pourque le texte s'étireet remplisse toutle composant surl'axe vertical.

setGravity(int)

Gravity.TOPGravity.BOTTOMGravity.LEFTGravity.RIGHTGravity.CENTERGravity.CENTER_HORIZONTALGravity.CENTER_VERTICALGravity.FILLGravity.FILL_HORIZONTALGravity.FILL_VERTICAL

Partie 2 : Annexes 84/89

www.siteduzero.com

Page 86: 554364-developpement-d-applications-pour-terminaux-android.pdf

android:text

Définir letextequ'afficheralecomposant.

La chaîne de caractères àafficher.

setText(CharSequence) La chaîne de caractères à afficher.

Partie 2 : Annexes 85/89

www.siteduzero.com

Page 87: 554364-developpement-d-applications-pour-terminaux-android.pdf

EditTextAttribut Description Valeur XML et effet Équivalent Java Valeur Java

android:inputType

Indiquepour queltype detexte serautilisé cechamps.Parexemple, sion dit quele champservira àindiquerune adresseemail, leclaviervirtuelfacilitera lasaisie enmettant enavantl'arobase.

text pour tous lestextes normaux.textEmailAddresspour pouvoirinsérer uneadresse email.numberDecimalpour pouvoirinsérer des valeursnumériques avecéventuellementune virgule.textPasswordpour pouvoirinsérer un mot depasse, le texte seradonc caché.phone pourpouvoir insérer unnuméro detéléphone.datetime pourpouvoir insérerune date et uneheure.date pour pouvoirinséreruniquement desdates.time pour pouvoirinséreruniquement desheures.

setRawInputType(int)

InputType.TYPE_CLASS_TEXTTYPE_CLASS_TEXT |TYPE_TEXT_VARIATION_EMAIL_ADDRESSTYPE_CLASS_NUMBER |TYPE_NUMBER_FLAG_DECIMALTYPE_CLASS_TEXT |TYPE_TEXT_VARIATION_PASSWORDTYPE_CLASS_PHONETYPE_CLASS_DATETIME |TYPE_DATETIME_VARIATION_NORMALTYPE_CLASS_DATETIME |TYPE_DATETIME_VARIATION_DATETYPE_CLASS_DATETIME |TYPE_DATETIME_VARIATION_TIME

android:hint

Cettefonctionpermetd'écrire untexteindicatifdans lechamps.

On peut indiquerdirectement la chaîne decaractères ou uneréférence vers uneressource.

setHint(int) ou setHint(string)

On peut indiquer directement la chaîne de caractères ouune référence vers une ressource.

Faites attention, la méthode « android:text » va établir la valeur du champ, c'est-à-dire ce qu'il vaudra par défaut. Letexte indiqué devra être supprimé par l'utilisateur s'il veut le changer.En revanche, « android:hint » permet de préciser une valeur qui sera écrite dans le champ, mais pas comme unevaleur, juste comme une indication, qui ne sera pas prise en compte en tant que valeur. L'utilisateur n'aura pas àsupprimer ce texte, et ne sera pas la valeur par défaut.

Partie 2 : Annexes 86/89

www.siteduzero.com

Page 88: 554364-developpement-d-applications-pour-terminaux-android.pdf

CheckBoxAttribut Description Valeur

android:checked La case est-elle cochée à l'initialisation ? Un booléen.

Partie 2 : Annexes 87/89

www.siteduzero.com

Page 89: 554364-developpement-d-applications-pour-terminaux-android.pdf

RadioGroupAttribut Description Valeur

android:checkedButton Quel est le bouton qui sera sélectionné par défaut ?L'identifiant de l'un des boutons quiappartient au groupe.

android:orientationSouhaitez-vous que le groupe se dirige de manièrehorizontale ou verticale ?

0 pour horizontal.1 pour vertical.

Partie 2 : Annexes 88/89

www.siteduzero.com

Page 90: 554364-developpement-d-applications-pour-terminaux-android.pdf

RelativeLayoutAttribut Description

android:layout_above Aligne la base du widget avec le sommet du widget référencé.

android:layout_alignBaselineAligne le centre du widget sur le même axe horizontal que le centre du widgetréférencé.

android:layout_alignBottom Aligne la base du widget avec la base du widget référencé.

android:layout_alignLeft Aligne le côté gauche du widget avec le côté gauche du widget référencé.

android:layout_alignParentBottomNécessite un booléen. Aligne la base du widget avec la base du parent en cas detrue.

android:layout_alignParentLeftNécessite un booléen. Aligne le côté gauche du widget avec le côté gauche duparent en cas de true.

android:layout_alignParentRightNécessite un booléen. Aligne le côté droit du widget avec le côté droit duparent en cas de true.

android:layout_alignParentTopNécessite un booléen. Aligne le sommet du widget avec le sommet du parent encas de true.

android:layout_alignRight Aligne le côté droit du widget avec le côté droit du widget référencé.

android:layout_alignTop Aligne le sommet du widget avec le sommet du widget référencé.

android:layout_alignWithParentIfMissingNécessite un booléen. Si le widget référencé n'est pas trouvé, c'est le layoutparent qui remplacera le widget en cas de true

android:layout_below Aligne le sommet du widget avec la base du widget référencé.

android:layout_centerHorizontalNécessite un booléen. Aligne le widget horizontalement dans le parent en casde true.

android:layout_centerInParentNécessite un booléen. Aligne le widget horizontalement et verticalement dansle parent en cas de true.

android:layout_centerVerticalNécessite un booléen. Aligne le widget verticalement dans le parent en cas detrue.

android:layout_toLeftOf Aligne le côté droit du widget avec le côté gauche du widget référencé.

android:layout_toRightOf Aligne le côté gauche du widget avec le côté droit du widget référencé.

Voilà, c'est terminé ! Non je plaisante, on est encore très loin de la complétion.

Merci à Bérenger Pelou pour l'icône laide.

Remerciements

Pour leur(s) critique(s) perspicace(s), je tiens à remercier:

les bétas testeurs (Taguan, Tpt et nitneuq65).Hilaia.Remerciements spéciaux à John-John pour sa collaboration étroite.

Partie 2 : Annexes 89/89

www.siteduzero.com