Programmation Android L3 informatique



Documents pareils
Programmation des applications mobiles avec Android. 1 Inspiré du cours de Olivier Le Goaer

TP SIN Programmation sur androïde Support : eclipse

Créer des applications Android

Outils, langage et approche Android Une introduction. Nicolas Stouls lyon.fr

TP au menu «UI ANDROID»

Tutoriel Android. Pour démarrer la programmation d'applications Android

Projet Android (LI260) Cours 2

Programmation mobile avec Android

1.3 Gestion d'une application

Warren PAULUS. Android SDK et Android x86

Tutorial pour une application simple

SOMMAIRE

Les fondamentaux du développement d applications Java

Tutoriel Android - TP de prise en main

De Java à Android version 0.1

TP2 : Client d une BDD SqlServer

Introduction ANDROID

1. Base de données SQLite

Android 4 Les fondamentaux du développement d'applications Java

Bases de données et fournisseurs de contenu

Développement Android. J.-F. Couchot

Encore plus de widgets et de conteneurs

Développement sous Android

Épisode 2 : Les outils de développement Alain Menu édition 2.1, septembre 2013

Table des matières. Partie I Concepts de base Préface... VII

Programmation Mobile Android Master CCI

TD/TP 1 Introduction au SDK d Android

Module Architecture des systèmes mobiles : Android première partie Didier FERMENT - UPJV

Android en action. Abdelkader Lahmadi Université de Lorraine

Stockage de données sous Android

TP1 : Initiation à Java et Eclipse

- TP Programmation Android - NFA024 Conservatoire National des Arts et Métiers

Android Publish/Subscribe, GCM, Google Cloud Messaging : une introduction

APPLICATIONS JAVA. 1. Android. Développement d'activités Java sous Android. Android Partie I. L'architecture du système Android. Application Android

Architectures Mobiles

Présentation du système d exploitation Open Source ANDROID

Développement d applications professionnelles avec Android 2

Bases Java - Eclipse / Netbeans

Développement sous Android

Gestion des différentes tailles d écran

Android. Programmation. De la conception au déploiement avec le SDK Google Android 2. Damien Guignard Julien Chable Emmanuel Robles

Plan du cours. Historique du langage Nouveautés de Java 7

République Algérienne Démocratique et Populaire Université Abou Bakr Belkaid Tlemcen Faculté des Sciences Département d Informatique

OpenPaaS Le réseau social d'entreprise

Dossier. Développer en Java sur téléphone mobile. Benjamin Damécourt UFR SITEC Master 2 EESC 11 janvier 2012

Application de messagerie simple sur Android : Rapport de projet de VAP RSM

Terminaux Mobiles Communicants

Android. Présentation d Android. Florent Garin

Votre premier projet Android

Introduction à Eclipse

Génie Logiciel et Interaction Homme-Machine PROJET UCAMPUS

Android 101. Rémi Forax

Développement mobile MIDP 2.0 Mobile 3D Graphics API (M3G) JSR 184. Frédéric BERTIN

Android et le Cloud Computing

Serveur d'application Client HTML/JS. Apache Thrift Bootcamp

Développement d'applications pour Android. M. Dalmau IUT de Bayonne Pays Basque

Programmer en JAVA. par Tama

DÉVELOPPEMENT ANDROID

Education Delivery Intelligent Tool

Eclipse atelier Java

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

BIRT (Business Intelligence and Reporting Tools)

Corrigé des exercices sur les références

JADE : Java Agent DEvelopment framework. Laboratoire IBISC & Départ. GEII Université & IUT d Evry nadia.abchiche@ibisc.univ-evry.

TP1 : Initiation à Java et Eclipse

Installation et prise en main

Anne Tasso. Java. Le livre de. premier langage. 10 e édition. Avec 109 exercices corrigés. Groupe Eyrolles, , ISBN :

Cours 1: Java et les objets

Auto-évaluation Programmation en Java

Optimiser pour les appareils mobiles

Cours Plugin Eclipse. Université Paris VI / Parcours STL / Master I Pierre-Arnaud Marcelot - Iktek - pamarcelot@iktek.com

as Architecture des Systèmes d Information

Utilisation de JAVA coté Application serveur couplé avec Oracle Forms Hafed Benteftifa Novembre 2008

Langage et Concepts de ProgrammationOrientée-Objet 1 / 40

Développement d'applications pour Android

Alfstore workflow framework Spécification technique

Chapitre 1 Retour en arrière

Licence Bio Informatique Année Premiers pas. Exercice 1 Hello World parce qu il faut bien commencer par quelque chose...

AVEC LIVE TRADER, VISEZ PLUS HAUT POUR VOS INVESTISSEMENTS

Prénom : Matricule : Sigle et titre du cours Groupe Trimestre INF1101 Algorithmes et structures de données Tous H2004. Loc Jeudi 29/4/2004

MEGA ITSM Accelerator. Guide de démarrage

MEGA ITSM Accelerator. Guide de Démarrage

Générer du code à partir d une description de haut niveau

WINDEV MOBILE. ios SMARTPHONE SUPPORT: IOS, ANDROID, WINDOWS PHONE 8.

Développement Logiciel

La base de données XML exist. A. Belaïd

Android UIThread, Thread, Handler et AsyncTask

Des outils numériques simples et conviviaux!

Annexe Android Studio

Environnements de développement (intégrés)

Page 1 sur 5 TP3. Thèmes du TP : l la classe Object. l Vector<T> l tutorial Interfaces. l Stack<T>

Quelques patterns pour la persistance des objets avec DAO DAO. Principe de base. Utilité des DTOs. Le modèle de conception DTO (Data Transfer Object)

Initiation à JAVA et à la programmation objet.

Structure d un programme et Compilation Notions de classe et d objet Syntaxe

Interfaces graphiques avec l API Swing

Introduction au langage C

Info0101 Intro. à l'algorithmique et à la programmation. Cours 3. Le langage Java

D E S C R I P T I O N D E S É L É M E N T S C L E F S D ' U I M A

Java Licence Professionnelle Cours 7 : Classes et méthodes abstraites

Transcription:

Programmation Android L3 informatique Étienne Payet Département de mathématiques et d informatique Ces transparents sont mis à disposition selon les termes de la Licence Creative Commons Paternité - Pas d Utilisation Commerciale - Pas de Modification 3.0 non transcrit. Étienne Payet (DMI) Programmation Android L3 informatique 1 / 120

Plan 1 Introduction 2 Anatomie d une application Android 3 Déploiement d une application 4 Ressources 5 Éléments de base des interfaces graphiques 6 Présentation sous forme de listes 7 Communication entre activités 8 Persistance des données Étienne Payet (DMI) Programmation Android L3 informatique 2 / 120

Ressources http://developer.android.com livres : il y en a beaucoup... Android Programming : The Big Nerd Ranch Guide (Phillips & Hardy) voir à la BU privilégiez ceux traitant des dernières versions d Android Étienne Payet (DMI) Programmation Android L3 informatique 3 / 120

Pour pouvoir travailler développement : Windows XP, Mac OS X 10.5.8 (x86), Linux JDK 5, Android SDK au moins une plateforme Android recommandé : Eclipse 3.5 + plugin ADT ou Android Studio déploiement : un device Android Étienne Payet (DMI) Programmation Android L3 informatique 4 / 120

Workflow d Android 1. Développement 2. Test 3. Publication Eclipse + ADT Émulateur Google Play Android Studio Appareil mobile Étienne Payet (DMI) Programmation Android L3 informatique 5 / 120

Architecture d Android Étienne Payet (DMI) Programmation Android L3 informatique 6 / 120

Architecture d Android Applications Application framework Libraries Android Runtime Linux Kernel noyau Linux 2.6, sécurité, gestion mémoire, gestion processus,... Étienne Payet (DMI) Programmation Android L3 informatique 7 / 120

Architecture d Android Applications Application framework Libraries Android Runtime Linux Kernel fonctionnalités de la bibliothèque Java standard, Dalvik VM noyau Linux 2.6, sécurité, gestion mémoire, gestion processus,... Étienne Payet (DMI) Programmation Android L3 informatique 8 / 120

Architecture d Android Applications Application framework Libraries Android Runtime Linux Kernel bibliothèques C/C++ fonctionnalités de la bibliothèque Java standard, Dalvik VM noyau Linux 2.6, sécurité, gestion mémoire, gestion processus,... Étienne Payet (DMI) Programmation Android L3 informatique 9 / 120

Architecture d Android Applications Application framework Libraries Android Runtime Linux Kernel API Java (gestion de fenêtres, de téléphonie,... ) bibliothèques C/C++ fonctionnalités de la bibliothèque Java standard, Dalvik VM noyau Linux 2.6, sécurité, gestion mémoire, gestion processus,... Étienne Payet (DMI) Programmation Android L3 informatique 10 / 120

Architecture d Android Applications des applications écrites en Java (navigateur Web, contacts,... ) Application framework Libraries Android Runtime Linux Kernel API Java (gestion de fenêtres, de téléphonie,... ) bibliothèques C/C++ fonctionnalités de la bibliothèque Java standard, Dalvik VM noyau Linux 2.6, sécurité, gestion mémoire, gestion processus,... Étienne Payet (DMI) Programmation Android L3 informatique 11 / 120

Exercice : Hello World! Étienne Payet (DMI) Programmation Android L3 informatique 12 / 120

Exercice : Hello World! Étienne Payet (DMI) Programmation Android L3 informatique 13 / 120

Exercice : Hello World! la couleur du texte change à chaque affichage Étienne Payet (DMI) Programmation Android L3 informatique 14 / 120

Plan 1 Introduction 2 Anatomie d une application Android 3 Déploiement d une application 4 Ressources 5 Éléments de base des interfaces graphiques 6 Présentation sous forme de listes 7 Communication entre activités 8 Persistance des données Étienne Payet (DMI) Programmation Android L3 informatique 15 / 120

Développement d une application code source : écrit en Java compilé en Dalvik bytecode (.dex) Dalvik bytecode Java bytecode configuration : AndroidManifest.xml ressources : chaînes de caractères, images, audio, présentation visuelle,... certaines peuvent être décrites en XML Étienne Payet (DMI) Programmation Android L3 informatique 16 / 120

Compilation et exécution Étienne Payet (DMI) Programmation Android L3 informatique 17 / 120

Exécution chaque application tourne : dans son propre processus sur sa propre machine virtuelle isolément des autres applications (bac-à-sable de sécurité) Étienne Payet (DMI) Programmation Android L3 informatique 18 / 120

AndroidManifest.xml décrit les composants de l application décrit les permissions requises par l application (accès à l Internet, lecture-écriture dans la liste de contacts, géo-localisation,... ) décrit les besoins matériels et logiciels de l application (appareil photo, bluetooth, écran multitouch,... ) Étienne Payet (DMI) Programmation Android L3 informatique 19 / 120

Composants d une application un composant = un point d entrée potentiel dans l application une application peut lancer un composant d une autre application plusieurs points d entrée potentiels (pas de méthode main) application Java classique Étienne Payet (DMI) Programmation Android L3 informatique 20 / 120

Composants d une application quatre types de composants : activités (activities) services (services) fournisseurs de contenu (content providers) récepteurs de diffusion (broadcast receivers) Étienne Payet (DMI) Programmation Android L3 informatique 21 / 120

Composants d une application : AndroidManifest.xml <activity android:name=".helloworldactivity" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.main"/> <category android:name="android.intent.category.launcher"/> </intent-filter> </activity> action MAIN = un point d entrée principal (pas d information particulière à fournir) catégorie LAUNCHER = point d entrée apparaissant dans le lanceur Étienne Payet (DMI) Programmation Android L3 informatique 22 / 120

Activité un écran avec une interface utilisateur graphique structurée par une hiérarchie de vues et de contrôles des éléments définis par du code Java dans l activité des éléments définis dans des fichiers XML (ressources) sous-classe de android.app.activity Étienne Payet (DMI) Programmation Android L3 informatique 23 / 120

Activité Exemple : application Email une activité afficheremails une activité composeremail une activité lireemail Une application Photo pourra lancer l activité composeremail pour envoyer une photo. Étienne Payet (DMI) Programmation Android L3 informatique 24 / 120

Activité : squelette minimal import android.app.activity; import android.os.bundle; public class HelloWorldActivity extends Activity { /** Called when the activity is first created. */ @Override public void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(...); } } Étienne Payet (DMI) Programmation Android L3 informatique 25 / 120

Activité : cycle de vie états principaux : active (active) : activité visible et détient le focus (méthode onresume) suspendue (paused) : activité en partie visible et ne détient pas le focus (méthode onpause) arrêtée (stopped) : activité non-visible (méthode onstop) Étienne Payet (DMI) Programmation Android L3 informatique 26 / 120

Activité : cycle de vie Étienne Payet (DMI) Programmation Android L3 informatique 27 / 120

Service composant qui fonctionne en tâche de fond ne fournit pas d interface utilisateur (invisible) sous-classe de android.app.service Exemple : musique en tâche de fond Un service pourrait jouer de la musique en tâche de fond pendant que l utilisateur est dans une application différente. Étienne Payet (DMI) Programmation Android L3 informatique 28 / 120

Fournisseur de contenu permet de gérer et de partager des données sous-classe de android.content.contentprovider Exemple : liste de contacts La liste de contacts de l utilisateur est gérée par un fournisseur de contenu auquel toute application ayant les droits appropriés peut envoyer des requêtes pour lire ou écrire dans la liste de contacts. Étienne Payet (DMI) Programmation Android L3 informatique 29 / 120

Récepteur permet de réagir à la diffusion d annonces sous-classe de android.content.broadcastreceiver Exemples d annonces système l écran s est éteint la batterie est faible Étienne Payet (DMI) Programmation Android L3 informatique 30 / 120

Exercice Certains de ces éléments apparaissent dans votre application Hello World! Repérez-les! Étienne Payet (DMI) Programmation Android L3 informatique 31 / 120

Plan 1 Introduction 2 Anatomie d une application Android 3 Déploiement d une application 4 Ressources 5 Éléments de base des interfaces graphiques 6 Présentation sous forme de listes 7 Communication entre activités 8 Persistance des données Étienne Payet (DMI) Programmation Android L3 informatique 32 / 120

Au préalable AndroidManifest.xml : application debuggable (Eclipse : AndroidManifest.xml onglet Application ) sur le device : autoriser Unknown sources (Settings Applications) autoriser USB debugging (Settings Applications Development) l ordinateur doit détecter le device (adb devices dans le terminal pour vérifier si connecté) Étienne Payet (DMI) Programmation Android L3 informatique 33 / 120

Depuis Eclipse Comme avec l émulateur! Run AS Android Application choisir le device dans le Device Chooser qui apparaît Étienne Payet (DMI) Programmation Android L3 informatique 34 / 120

Exercice Déployez votre application Hello World! sur votre device. Étienne Payet (DMI) Programmation Android L3 informatique 35 / 120

Plan 1 Introduction 2 Anatomie d une application Android 3 Déploiement d une application 4 Ressources 5 Éléments de base des interfaces graphiques 6 Présentation sous forme de listes 7 Communication entre activités 8 Persistance des données Étienne Payet (DMI) Programmation Android L3 informatique 36 / 120

Ressources chaînes de caractères, images, audio, présentation visuelle,... dossier res/ Étienne Payet (DMI) Programmation Android L3 informatique 37 / 120

Structure habituelle du dossier res MonProjet/ src/ MonActivite.java res/ drawable/ icon.png layout/ main.xml values/ strings.xml Étienne Payet (DMI) Programmation Android L3 informatique 38 / 120

Ressources : séparées du code source externalisation : maintenance indépendante du code source ressources alternatives pour des configurations spécifiques (langues, tailles d écran,... ) Étienne Payet (DMI) Programmation Android L3 informatique 39 / 120

Ressources alternatives Étienne Payet (DMI) Programmation Android L3 informatique 40 / 120

Ressources alternatives MonProjet/ src/ MonActivite.java res/ drawable/ icon.png drawable-hdpi/ icon.png layout/ main.xml layout-land/ main.xml values/ strings.xml values-fr/ strings.xml Étienne Payet (DMI) Programmation Android L3 informatique 41 / 120

Ressources : utilisation dans le code classe R : générée automatiquement à la compilation contient l ID de chaque ressource public final class R { public static final class drawable { public static final int icon=0x7f020000; } } public static final class id { public static final int msgtext=0x7f050000; } public static final class layout { public static final int main=0x7f030000; } public static final class string { public static final int app_name=0x7f040001; public static final int hello=0x7f040000; } Étienne Payet (DMI) Programmation Android L3 informatique 42 / 120

Ressources : utilisation dans le code plusieurs méthodes acceptent un ID de ressource en paramètre import android.app.activity; import android.os.bundle; import android.widget.textview; public class HelloWorldActivity extends Activity { /** Called when the activity is first created. */ @Override public void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); } } setcontentview(r.layout.main); String machaine = getstring(r.string.hello); TextView message = (TextView) findviewbyid(r.id.msgtext); message.settext(r.string.hello); Étienne Payet (DMI) Programmation Android L3 informatique 43 / 120

Ressources : utilisation dans d autres ressources res/layout/main.xml : <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/hello"/> </LinearLayout> Étienne Payet (DMI) Programmation Android L3 informatique 44 / 120

Ressources systèmes dans le code : android.r.string.unknownname dans une autre ressource : <?xml version="1.0" encoding="utf-8"?> <EditText id="text" xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:text="@android:string/unknownname"/> Étienne Payet (DMI) Programmation Android L3 informatique 45 / 120

Exercice l affichage change en fonction de la langue et de l orientation de l écran : Étienne Payet (DMI) Programmation Android L3 informatique 46 / 120

Plan 1 Introduction 2 Anatomie d une application Android 3 Déploiement d une application 4 Ressources 5 Éléments de base des interfaces graphiques 6 Présentation sous forme de listes 7 Communication entre activités 8 Persistance des données Étienne Payet (DMI) Programmation Android L3 informatique 47 / 120

Description des interfaces graphiques 2 possibilités : description déclarative en XML (dossier res/layout/) en Java Étienne Payet (DMI) Programmation Android L3 informatique 48 / 120

Vue composant élémentaire des interfaces graphiques sous Android : instance de la classe View rectangle où on peut dessiner, sensible aux événements tous les composants graphiques (widgets) d Android sont des vues : boutons, étiquettes, zones de texte... Étienne Payet (DMI) Programmation Android L3 informatique 49 / 120

Organisation hiérarchique des vues la classe ViewGroup (hérite de View) permet de regrouper des vues Étienne Payet (DMI) Programmation Android L3 informatique 50 / 120

Associer une hiérarchie de vues à une activité appeler la méthode setcontentview : dans oncreate paramètre = une référence à la racine de la hiérarchie Étienne Payet (DMI) Programmation Android L3 informatique 51 / 120

Layout c est une organisation particulière d un groupe de vues sous-classe de ViewGroup Android fournit plusieurs layouts Étienne Payet (DMI) Programmation Android L3 informatique 52 / 120

Quelques layouts fournis par Android FrameLayout : le plus basique, chaque élément est positionné dans le coin en haut à gauche, par-dessus les éléments ajoutés avant usage : affichage d un seul élément LinearLayout : les éléments sont positionnés les uns à la suite des autres, de gauche à droite et de haut en bas TableLayout : les éléments sont positionnés dans un tableau RelativeLayout : les éléments sont positionnés les uns par rapport aux autres Étienne Payet (DMI) Programmation Android L3 informatique 53 / 120

Layout : exemple res/layout/main.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/hello"/> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/coucou"/> </LinearLayout> Étienne Payet (DMI) Programmation Android L3 informatique 54 / 120

Layout : taille les attributs layout_width et layout_height peuvent contenir : une taille précise (unités : dp, sp, pt, px, mm, in) l une des constantes : match_parent : prendre toute la place disponible (fill_parent dans les versions d Android < 2.2) wrap_content : ne prendre que la place nécessaire Étienne Payet (DMI) Programmation Android L3 informatique 55 / 120

Définition d une interface en XML chaque fichier XML décrivant l interface : doit être placé dans le dossier res/layout a un identifiant unique : généré automatiquement (ex : monlayout.xml R.layout.monLayout) permet de faire référence au fichier dans le code (ex : setcontentview(r.layout.monlayout)) Étienne Payet (DMI) Programmation Android L3 informatique 56 / 120

Définition d une interface en XML res/layout/main.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/msgtext"/> </LinearLayout> Étienne Payet (DMI) Programmation Android L3 informatique 57 / 120

Définition d une interface en XML attribut id : associe un identifiant unique à une vue le signe + dans @+id signifie qu il s agit d un nouveau nom de ressource, à créer et à ajouter à la classe R identifiants fournis par le système : android:id="@android:id/empty" Étienne Payet (DMI) Programmation Android L3 informatique 58 / 120

Définition d une interface en XML import android.app.activity; import android.os.bundle; import android.widget.textview; public class HelloWorldActivity extends Activity { /** Called when the activity is first created. */ @Override public void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.main); } } TextView message = (TextView) findviewbyid(r.id.msgtext); message.settext("hello, World!"); Étienne Payet (DMI) Programmation Android L3 informatique 59 / 120

Définition d une interface en Java pour obtenir le même résultat que précédemment, en Java uniquement : import android.app.activity; import android.os.bundle; import android.widget.textview; public class HelloWorldActivity extends Activity { /** Called when the activity is first created. */ @Override public void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); } } TextView message = new TextView(this); message.settext("hello, World!"); setcontentview(message); Étienne Payet (DMI) Programmation Android L3 informatique 60 / 120

Définition d une interface en Java : layouts import android.app.activity; import android.os.bundle; import android.widget.linearlayout; import android.widget.textview; public class HelloWorldActivity extends Activity { @Override public void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); } } LinearLayout mlayout = new LinearLayout(this); mlayout.setorientation(linearlayout.vertical); TextView message1 = new TextView(this); TextView message2 = new TextView(this); message1.settext("hello, World!"); message2.settext("bonjour tout le monde!"); mlayout.addview(message1); setcontentview(mlayout); mlayout.addview(message2); Étienne Payet (DMI) Programmation Android L3 informatique 61 / 120

Définition d une interface : XML ou Java? interface en XML : séparation stricte de la présentation et de la logique fonctionnelle de l application c est la meilleure pratique en général ce qui est faisable en XML est faisable en Java à chaque vue, attribut, constante... utilisé en XML correspond une vue, un attribut, une constante... en Java Étienne Payet (DMI) Programmation Android L3 informatique 62 / 120

Gestion des événements à certains événements sont associés un attribut XML : res/layout/main.xml <Button... android:onclick="sayhello".../> HelloWorldActivity.java public class HelloWorldActivity extends Activity { private TextView hellolabel; @Override public void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.main); hellolabel = (TextView) findviewbyid(r.id.hello_label); } public void sayhello(view v) { hellolabel.settext(r.string.hello); } } Étienne Payet (DMI) Programmation Android L3 informatique 63 / 120

Gestion des événements écouteur (listener) : au cœur du mécanisme d interception des événements associe un événement à une méthode à appeler lorsque l événement survient les événements interceptés et les méthodes associées sont prédéfinis ex : événement onclick méthode onclick() Étienne Payet (DMI) Programmation Android L3 informatique 64 / 120

Gestion des événements res/layout/main.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center_vertical center_horizontal"> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/mbutton" android:text="@string/ok"/> </LinearLayout> Étienne Payet (DMI) Programmation Android L3 informatique 65 / 120

Gestion des événements import... public class MyActivity extends Activity { @Override public void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.main); Button b = (Button) findviewbyid(r.id.mbutton); b.setonclicklistener(new OnClickListener() { @Override public void onclick(view v) { Toast.makeText(MyActivity.this, "click", Toast.LENGTH_LONG).show(); } }); Étienne Payet (DMI) Programmation Android L3 informatique 66 / 120

Gestion des événements ou bien : import... public class myactivity extends Activity implements OnClickListener { public void oncreate(bundle savedvalues) {... Button b = (Button) findviewbyid(r.id.mbutton); b.setonclicklistener(this); } } public void onclick(view v) { Toast.makeText(this, "click", Toast.LENGTH_LONG).show(); }... Étienne Payet (DMI) Programmation Android L3 informatique 67 / 120

Exercice : Dizainier Étienne Payet (DMI) Programmation Android L3 informatique 68 / 120

Construire ses propres vues créer une classe héritant de View (ou d une de ses sous-classes) 3 constructeurs : public MyView(Context context, AttributeSet attrs, int defstyle) public MyView(Context context, AttributeSet attrs) public MyView(Context context) le paramètre attrs sert lors de définitions XML d interfaces affichage : protected void ondraw(canvas canvas) forcer le rafraîchissement : void invalidate() Étienne Payet (DMI) Programmation Android L3 informatique 69 / 120

Construire ses propres vues : exemple package com.example; public class MyView extends View { } public MyView(Context context, AttributeSet attrs) { super(context, attrs);... } protected void ondraw(canvas canvas) { int x = getwidth(); int y = getheight(); } Paint paint = new Paint(); paint.setcolor(android.graphics.color.white); canvas.drawline(0, 0, x, y, paint); super.ondraw(canvas); Étienne Payet (DMI) Programmation Android L3 informatique 70 / 120

Scroll : classes ScrollView et HorizontalScrollView <ScrollView android:layout_width="match_parent" android:layout_height="match_parent" > <HorizontalScrollView android:layout_width="match_parent" android:layout_height="wrap_content" > <LinearLayout android:layout_width="wrap_content" android:layout_height="match_parent" android:orientation="horizontal" > <com.example.myview android:layout_width="2000dp" android:layout_height="3000dp" /> </LinearLayout> </HorizontalScrollView> </ScrollView> Étienne Payet (DMI) Programmation Android L3 informatique 71 / 120

Exercice : Cercles créer une classe CerclesView compléter ondraw : dessiner 20 cercles gris, position au hasard, rayon croissant, épaisseur du trait : 5 pixels un tap sur l écran efface les cercles et en dessine 20 nouveaux scroll vertical et horizontal Étienne Payet (DMI) Programmation Android L3 informatique 72 / 120

Exercice : Cercles (variante) Étienne Payet (DMI) Programmation Android L3 informatique 73 / 120

Plan 1 Introduction 2 Anatomie d une application Android 3 Déploiement d une application 4 Ressources 5 Éléments de base des interfaces graphiques 6 Présentation sous forme de listes 7 Communication entre activités 8 Persistance des données Étienne Payet (DMI) Programmation Android L3 informatique 74 / 120

Listes créer une instance de ListActivity, qui intègre automatiquement : une vue, instance de la classe ListView un adaptateur, instance d une implémentation de ListAdapter Étienne Payet (DMI) Programmation Android L3 informatique 75 / 120

Adaptateurs réalisent l interfaçage entre l affichage (widgets) et les données pour l interfaçage avec une ListView : interface ListAdapter implémentations de ListAdapter, selon la source de données : ArrayAdapter : données stockées dans un tableau CursorAdapter : données de type Cursor SimpleCursorAdapter : sur-couche de CursorAdapter... Étienne Payet (DMI) Programmation Android L3 informatique 76 / 120

Cellules à 1 ligne les données à afficher (tableau de chaînes de caractères) : res/values/strings.xml <?xml version="1.0" encoding="utf-8"?> <resources>... <string-array name="systems"> <item>android</item> <item>ios</item> <item>blackberry</item> <item>bada</item> </string-array> </resources> Étienne Payet (DMI) Programmation Android L3 informatique 77 / 120

Cellules à 1 ligne public class MyListActivity extends ListActivity { @Override public void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); String[] systems = getresources().getstringarray(r.array.systems); setlistadapter(new ArrayAdapter<String>(this, android.r.layout.simple_list_item_1, systems)); } @Override protected void onlistitemclick(listview l, View v, int position, long id) { super.onlistitemclick(l, v, position, id); Toast.makeText(this, "item " + id + " clicked", Toast.LENGTH_SHORT).show(); } } Étienne Payet (DMI) Programmation Android L3 informatique 78 / 120

Cellules à 2 lignes public class MyListActivity extends ListActivity { public void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); ArrayList<Map<String,String>> list = new ArrayList<Map<String,String>>(); Map<String, String> maplist; maplist = new HashMap<String, String>(); maplist.put("ligne1", "Prendre une douche"); maplist.put("ligne2", "priorité: 0"); list.add(maplist); maplist = new HashMap<String, String>(); maplist.put("ligne1", "Faire une sieste"); maplist.put("ligne2", "priorité: 2"); list.add(maplist); String[] from = { "ligne1", "ligne2" }; int[] to = { android.r.id.text1, android.r.id.text2 }; SimpleAdapter adapter = new SimpleAdapter(this, list, android.r.layout.simple_list_item_2, from, to); setlistadapter(adapter); } Étienne Payet (DMI) Programmation Android L3 informatique 79 / 120

Cellules personnalisées res/layout/cell_layout.xml : <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="wrap_content" > <ImageView android:id="@+id/image" android:layout_width="wrap_content" android:layout_height="fill_parent" android:src="@drawable/icon" /> <TextView android:id="@+id/label" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textsize="20dp" /> </LinearLayout> Étienne Payet (DMI) Programmation Android L3 informatique 80 / 120

Cellules personnalisées public class MyListActivity extends ListActivity { } public void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); } String[] values = new String[] { "Android", "ios", "Blackberry", "Bada" }; ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, R.layout.cell_layout, R.id.label, values); setlistadapter(adapter); Étienne Payet (DMI) Programmation Android L3 informatique 81 / 120

Adaptateurs personnalisés public class MyArrayAdapter extends ArrayAdapter<String> { private final Context context; public MyArrayAdapter(Context context, String[] values) { super(context, R.layout.cell_layout, values); this.context = context; } public View getview(int position, View convertview, ViewGroup parent) { View cellview = convertview; if (cellview == null) { LayoutInflater inflater = (LayoutInflater) context.getsystemservice(context.layout_inflater_service); cellview = inflater.inflate(r.layout.cell_layout, parent, false); }... Étienne Payet (DMI) Programmation Android L3 informatique 82 / 120

Adaptateurs personnalisés... TextView textview = (TextView)cellView.findViewById(R.id.label); ImageView imageview = (ImageView)cellView.findViewById(R.id.image); String s = getitem(position); textview.settext(s); if (s.startswith("b")) imageview.setimageresource(r.drawable.icon0); else imageview.setimageresource(r.drawable.icon1); return cellview; } // fin de la méthode getview } // fin de la classe MyArrayAdapter Étienne Payet (DMI) Programmation Android L3 informatique 83 / 120

Adaptateurs personnalisés public class MyListActivity extends ListActivity { } private String tasks[] = { "Prendre une douche", "Faire une sieste" }; @Override public void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setlistadapter(new MyArrayAdapter(this, tasks)); }... Étienne Payet (DMI) Programmation Android L3 informatique 84 / 120

Exercice : Tâches créer une classe Tache : String titre int priorite ( [0, 4]) créer un type de cellule personnalisé créer un adaptateur personnalisé Étienne Payet (DMI) Programmation Android L3 informatique 85 / 120

Créer un menu pour une activité dans l activité, implémenter les méthodes suivantes : pour créer les éléments du menu : public boolean oncreateoptionsmenu(menu menu) pour réagir aux clics sur les éléments du menu : public boolean onoptionsitemselected(menuitem item) dans res/menu créer un fichier xml décrivant les items du menu Étienne Payet (DMI) Programmation Android L3 informatique 86 / 120

Créer un menu pour une activité : exemple public class MyActivity extends Activity {... @Override public boolean oncreateoptionsmenu(menu menu) { getmenuinflater().inflate(r.menu.optionsmenu, menu); return true; } } @Override public boolean onoptionsitemselected(menuitem item) { switch(item.getitemid()) { case R.id.action_settings:... return true; } return super.onoptionsitemselected(item); } Étienne Payet (DMI) Programmation Android L3 informatique 87 / 120

Créer un menu pour une activité : exemple fichier optionsmenu.xml : <menu...> <item android:id="@+id/action_settings" android:orderincategory="100" android:title="@string/action_settings"/> </menu> Étienne Payet (DMI) Programmation Android L3 informatique 88 / 120

Menu contextuel pour une activité dans l activité, implémenter les méthodes suivantes : pour créer les éléments du menu : public boolean oncreatecontextmenu(contextmenu menu, View v, ContextMenuInfo menuinfo) pour réagir aux clics sur les éléments du menu : public boolean oncontextitemselected(menuitem item) et dans oncreate enregistrer les vues réagissant au menu : registerforcontextmenu(une vue) Étienne Payet (DMI) Programmation Android L3 informatique 89 / 120

Menu contextuel pour une activité : exemple public class MyListActivity extends ListActivity { private ArrayAdapter<String> adapter; @Override public void oncreate(bundle savedinstancestate) {... adapter =...; setlistadapter(adapter); registerforcontextmenu(getlistview()); }... Étienne Payet (DMI) Programmation Android L3 informatique 90 / 120

Menu contextuel pour une activité : exemple... @Override public void oncreatecontextmenu(contextmenu menu, View v, ContextMenuInfo menuinfo) { super.oncreatecontextmenu(menu, v, menuinfo); getmenuinflater().inflate(r.menu.contextmenu, menu); } @Override public boolean oncontextitemselected(menuitem item) { AdapterContextMenuInfo menuinfo = (AdapterContextMenuInfo) item.getmenuinfo(); switch(item.getitemid()) { case R.id.action_delete: adapter.remove(adapter.getitem(menuinfo.position)); return true; } return super.oncontextitemselected(item); }... Étienne Payet (DMI) Programmation Android L3 informatique 91 / 120

Menu contextuel pour une activité : exemple fichier contextmenu.xml : <menu...> <item android:id="@+id/action_delete" android:orderincategory="100" android:title="@string/action_delete"/> </menu> Étienne Payet (DMI) Programmation Android L3 informatique 92 / 120

Exercice : Tâches menus permettant : d ajouter une tâche (titre et priorité fixés) de supprimer une tâche sélectionnée de quitter l application utiliser les méthodes de la classe ArrayAdapter : add remove pour ajouter et supprimer un élément de la source de données de l adaptateur (l affichage est rafraîchi automatiquement) Étienne Payet (DMI) Programmation Android L3 informatique 93 / 120

Plan 1 Introduction 2 Anatomie d une application Android 3 Déploiement d une application 4 Ressources 5 Éléments de base des interfaces graphiques 6 Présentation sous forme de listes 7 Communication entre activités 8 Persistance des données Étienne Payet (DMI) Programmation Android L3 informatique 94 / 120

Navigation entre écrans un écran = une activité passage d un écran à un autre = une activité en démarre une autre objet de la classe Intent pour le démarrage d une activité Étienne Payet (DMI) Programmation Android L3 informatique 95 / 120

Démarrer une activité de façon explicite déclarer l activité à démarrer dans AndroidManifest.xml : <application...> <activity android:name=".activiteademarrer"...> démarrage de l activité appelée dans l activité appelante : Intent intent = new Intent(this, ActiviteADemarrer.class); startactivity(intent); Étienne Payet (DMI) Programmation Android L3 informatique 96 / 120

Démarrer une activité et obtenir un retour identification de l activité appelée dans l activité appelante : private static final int ACTIVITE_A_DEMARRER = 1; démarrage de l activité appelée dans l activité appelante : Intent intent = new Intent(this, ActiviteADemarrer.class); startactivityforresult (intent, ACTIVITE_A_DEMARRER); traitement du retour dans l activité appelante : @Override protected void onactivityresult (int requestcode, int resultcode, Intent data) { switch(requestcode) { case ACTIVITE_A_DEMARRER: switch(resultcode) { case RESULT_OK:... case RESULT_CANCELED:... Étienne Payet (DMI) Programmation Android L3 informatique 97 / 120

Démarrer une activité et obtenir un retour dans l activité appelée : @Override public void onclick(view v) { switch (v.getid()) { case R.id.buttonOK: setresult(result_ok); finish(); break; case R.id.buttonCancel: setresult(result_canceled); finish(); break; } } Étienne Payet (DMI) Programmation Android L3 informatique 98 / 120

Échange de données entre activités association d une clé (chaîne de caractères) à la donnée à échanger ajouter une donnée à une instance de Intent : méthode putextra(clé, donnée) récupérer une donnée intégrée à une instance de Intent : intent.getextras().getxxx(clé) où XXX est le type de la donnée Étienne Payet (DMI) Programmation Android L3 informatique 99 / 120

Échange de données entre activités envoyer des données à l activité appelée : startactivity(intent intent) startactivityforresult(intent intent, int requestcode) méthode getintent() de la classe Activity envoyer des données à l activité appelante : setresult(int resultcode, Intent data) onactivityresult(int requestcode, int resultcode, Intent data) Étienne Payet (DMI) Programmation Android L3 informatique 100 / 120

Exercice : Tâches Étienne Payet (DMI) Programmation Android L3 informatique 101 / 120

Exercice Étienne Payet (DMI) Programmation Android L3 informatique 102 / 120

Plan 1 Introduction 2 Anatomie d une application Android 3 Déploiement d une application 4 Ressources 5 Éléments de base des interfaces graphiques 6 Présentation sous forme de listes 7 Communication entre activités 8 Persistance des données Étienne Payet (DMI) Programmation Android L3 informatique 103 / 120

SQLite système de gestion de bases de données relationnelles http://www.sqlite.org Étienne Payet (DMI) Programmation Android L3 informatique 104 / 120

Gestion d une base de données créer une classe adaptateur qui : encapsule la base de données (instance de SQLiteDatabase) encapsule une instance de SQLiteOpenHelper propose des méthodes pour l ouverture et la fermeture de la base propose des méthodes pour obtenir, ajouter, supprimer,... des données dans la base Étienne Payet (DMI) Programmation Android L3 informatique 105 / 120

classe SQLiteOpenHelper aide à créer, ouvrir et mettre à jour une base de données SQLite : public void oncreate(sqlitedatabase db) public void onupgrade(sqlitedatabase db, int oldversion, int newversion) public SQLiteDatabase getreadabledatabase() public SQLiteDatabase getwritabledatabase() Étienne Payet (DMI) Programmation Android L3 informatique 106 / 120

Classe adaptateur : exemple public class MyDBAdapter { public static final int DB_VERSION = 1; public static final String DB_NAME = "clients_database.db"; private static final String TABLE_CLIENTS = "table_clients"; public static final String COL_ID = "_id"; public static final String COL_NAME = "name"; public static final String COL_ADDR = "address"; private static final String CREATE_DB = "create table " + TABLE_CLIENTS + " (" + COL_ID + " integer primary key autoincrement, " + COL_NAME + " text not null, " + COL_ADDR + " text not null);"; private SQLiteDatabase mdb; private MyOpenHelper mopenhelper; // MyOpenHelper : voir plus bas Étienne Payet (DMI) Programmation Android L3 informatique 107 / 120

Classe adaptateur : exemple... public MyDBAdapter(Context context) { mopenhelper = new MyOpenHelper(context, DB_NAME, null, DB_VERSION); } public void open() { mdb = mopenhelper.getwritabledatabase(); } public void close() { mdb.close(); } Étienne Payet (DMI) Programmation Android L3 informatique 108 / 120

Requête de sélection sur une table méthode query de la classe SQLiteDatabase : public Cursor query ( String table, String[] columns, String where, String[] whereargs, String groupby, String having, String orderby ) Étienne Payet (DMI) Programmation Android L3 informatique 109 / 120

Requête de sélection sur une table la méthode query renvoie une instance de la classe Cursor qui permet de gérer un ensemble de données fournies par une requête intègre une gestion optimisée des ressources Étienne Payet (DMI) Programmation Android L3 informatique 110 / 120

Gestion d un curseur méthodes de la classe Cursor : navigation dans un curseur : movetofirst(), movetolast(), movetonext(), movetoprevious(),... informations sur un curseur : getcount(),... extraction de valeurs d un curseur : getxxx(i) où i est l indice de la colonne et XXX est le type de la valeur fermeture d un curseur : close() Étienne Payet (DMI) Programmation Android L3 informatique 111 / 120

Classe adaptateur : exemple on suppose écrite une classe Client de la forme : public class Client { private long id; private String name; private String address; public Client(long id, String name, String address) {... } }... Étienne Payet (DMI) Programmation Android L3 informatique 112 / 120

Classe adaptateur : exemple suite de la classe MyDBAdapter :... public Client getclient(long id) throws SQLException { Client cl = null; } Cursor c = mdb.query(table_clients, new String [] {COL_ID, COL_NAME, COL_ADDR}, COL_ID + " = " + id, null, null, null, null); if (c.getcount() > 0) { c.movetofirst(); cl = new Client(c.getLong(0), c.getstring(1), c.getstring(2)); } c.close(); return cl; Étienne Payet (DMI) Programmation Android L3 informatique 113 / 120

Classe adaptateur : exemple... public List<Client> getallclients() { List<Client> clients = new ArrayList<Client>(); } Cursor c = mdb.query(table_clients, new String[] {COL_ID, COL_NAME, COL_ADDR}, null, null, null, null, null); c.movetofirst(); while (!c.isafterlast()) { clients.add(new Client( c.getlong(0), c.getstring(1), c.getstring(2))); c.movetonext(); } c.close(); return clients; Étienne Payet (DMI) Programmation Android L3 informatique 114 / 120

Insertion et modification d une ligne on utilise une instance de la classe ContentValues permet de spécifier les valeurs de la ligne encapsule une collection de couples (nom de colonne, valeur) méthode put pour indiquer la valeur d une colonne Étienne Payet (DMI) Programmation Android L3 informatique 115 / 120

Classe adaptateur : exemple... public long insertclient(string name, String address) { ContentValues values = new ContentValues(); values.put(col_name, name); values.put(col_addr, address); return mdb.insert(table_clients, null, values); } public int updateclient(long id, String name, String address) { ContentValues values = new ContentValues(); values.put(col_name, name); values.put(col_addr, address); return mdb.update(table_clients, values, COL_ID + "=" + id, null); } public int removeclient(long id) { return mdb.delete(table_clients, COL_ID + " = " + id, null); } Étienne Payet (DMI) Programmation Android L3 informatique 116 / 120

Classe adaptateur : exemple... private class MyOpenHelper extends SQLiteOpenHelper { public MyOpenHelper(Context context, String name, CursorFactory cursorfactory, int version) { super(context, name, cursorfactory, version); } @Override public void oncreate(sqlitedatabase db) { db.execsql(create_db); } @Override public void onupgrade(sqlitedatabase db, int oldversion, int newversion) { db.execsql("drop table " + TABLE_CLIENTS + ";"); oncreate(db); } } } // fin de la classe MyDBAdapter Étienne Payet (DMI) Programmation Android L3 informatique 117 / 120

Afficher les données d une table sous forme de liste on procède comme précédemment (voir chapitre 6) public class MyListActivity extends ListActivity { private MyDBAdapter dbadapter; @Override public void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); } dbadapter = new MyDBAdapter(this); dbadapter.open(); setlistadapter(new MyArrayAdapter( this, dbadapter.getallclients())); Étienne Payet (DMI) Programmation Android L3 informatique 118 / 120

Afficher les données d une table sous forme de liste... @Override public void ondestroy() { dbadapter.close(); super.ondestroy(); } } // fin de la classe MyListActivity Étienne Payet (DMI) Programmation Android L3 informatique 119 / 120

Exercices tutoriel Notepad Tutorial sur http://developer.android.com application Tâches : rendez les tâches persistantes Étienne Payet (DMI) Programmation Android L3 informatique 120 / 120