[PDF] [PDF] Chapitre 3 bis Les interfaces utilisateurs avancés avec Android

SpinnerAdapter et ListAdapter sont des interfaces qui héritent de Adapter ❚ Spinner 19 Spinner ❚ C'est le composant graphique Android similaire au Combo box X\data\res\values\themes xml du sdk qui contient : qui redirige en fait sur 



Previous PDF Next PDF





[PDF] Interface graphique sous Android - IGM

Interface graphique sous Android res/layout : définition XML d'agencements de vues graphiques (sous forme Rendu graphique dans la thread principale



[PDF] Chapitre 3 Les interfaces utilisateurs avec Android - Cedric-Cnam

Les IHM graphiques avec Android Bibliothèque propre Pas AWT, ni Swing, ni Java ME / LCDUI Le premier est l'architecture de l'interface i e le placement des



[PDF] Chapitre 3 bis Les interfaces utilisateurs avancés avec Android

SpinnerAdapter et ListAdapter sont des interfaces qui héritent de Adapter ❚ Spinner 19 Spinner ❚ C'est le composant graphique Android similaire au Combo box X\data\res\values\themes xml du sdk qui contient : qui redirige en fait sur 



[PDF] Annexe Android Studio (33)

Génération de variante et de multiple APK Non Oui Complétion de code et refactorisation Base Avancé Éditeur d'interface graphique Oui Oui Signature 



[PDF] Développement dApplications Mobiles sous Android - LIRMM

Ressources limitées - Batterie (énergie), interface graphique, CPU, périphériques d'IO, Android Studio : https://developer android com/studio/ index html 18 



[PDF] Programmation sous Android

Une fois le logiciel ouvert, cliquez sur le bouton Android SDK Manager pour ouvrir l'outil Layout Name : nom du fichier qui contiendra l'interface graphique qui 



[PDF] Programmation Android L3 informatique - LIM

l'IDE Android Studio (attention : Eclipse+ADT deprecated) Déploiement : Composant élémentaire des interfaces graphiques sous Android : instance de la  



[PDF] Interface graphique XML - Ivan Madjarov

L'interface graphique est définie dans des fichiers XML présents dans le dossier res/layout d'un projet Android Studio Interface graphique avec XML IvMad 



[PDF] TP  : Initiation au développement sur Android

Minimum required SDK : API 14 (Ice Cream Sandwich) Next [Blank activity] Adaptons à présent l'interface graphique au besoins de notre application :

[PDF] plus haut jet d'eau du monde

[PDF] tp android corrigé

[PDF] tuto android studio

[PDF] le jet d'eau de genève exercice

[PDF] état d'agrégation définition

[PDF] condensation solide

[PDF] exemple de sublimation

[PDF] fluide frigorigène

[PDF] "extraits de romans célèbres"

[PDF] récit policier exemple

[PDF] norme photo visa canada

[PDF] photo format passeport canada

[PDF] programmation linéaire dualité exercices corrigés

[PDF] photo immigration canada

[PDF] photo visa canada maroc

© JMF (Tous droits réservés) 1

Chapitre 3 bis

Les interfaces utilisateurs

avancés avec Android

© JMF (Tous droits réservés) 2

Les IHM des smartphones

Pas seulement clavier écran

Mais écran tactile

GPS

Enregistrement de messages audio (notes audio)

Prendre des photos, des vidéos, les envoyer par le réseau (MMS) SMS

© JMF (Tous droits réservés) 3

Révision de l'épisode

précédent En Android, on construit les IHM plutôt avec un fichier XML rangé dans res\layout mon_ihm.xml contenant par exemple : Ce fichier est repéré dans le code Java par R.layout.nomBaseFichier et on positionne l'IHM de l'activité à l'aide de ce fichier par setContentView(R.layout.nomBaseFichier); On récupère un composant graphique particulier de l'IHM par la méthode "miracle" findViewById(R.id.idDuComposant); Remarque : les R. sont des int qui ont été généré par l'environnement dans le fichier R.java setContentView(R.layout.mon_ihm); TextView tx = (TextView) findViewById(R.id.text1);

© JMF (Tous droits réservés) 4

Taille : différence entre px,

px : Pixels - corresponds to actual pixels on the screen in : Inches - based on the physical size of the screen mm : Millimeters - based on the physical size of the screen pt : Points - 1/72 of an inch based on the physical size of the screen source : http://stackoverflow.com/questions/2025282/difference-of-px-dp-dip-and-sp-in-android

© JMF (Tous droits réservés) 5

Taille : différence entre px,

dp : Density-independent Pixels - an abstract unit that is based on the physical density of the screen. These units are relative to a 160 dpi screen, so one dp is one pixel on a 160 dpi screen. The ratio of dp-to-pixel will change with the screen density, but not necessarily in direct proportion. Note: The compiler accepts both "dip" and "dp", though "dp" is more consistent with "sp" En fait en général dp = (resolution en dpi/160) px . Sur un écran de résolution de 160 dpi, dp = px mais si la résolution est 320 dpi, on a plutôt

1 dp = 2 pixels

Conclusion ;: expression en dp => le système convertit cette unité en pixels physiques => l'image aura la même taille quel que soit l'écran source :

© JMF (Tous droits réservés) 6

Taille : différence entre px,

sp : Scale-independent Pixels - this is like the dp unit, but it is also scaled by the user's font size preference. It is recommend you use this unit when specifying font sizes, so they will be adjusted for both the screen density and user's preferences source : http://stackoverflow.com/questions/2025282/difference-of-px-dp-dip-and-sp-in-android

© JMF (Tous droits réservés) 7

Les bouton radios

A l'intérieur d'une boite de regroupement : le RadioGroup

Un android.widget.RadioGroup est un ViewGroup

est, par exemple, codé par :

© JMF (Tous droits réservés) 8

Gestion des événements

C'est similaire aux boutons "poussoirs"

Avec le code précédent :

rb1 = (RadioButton) findViewById(R.id.RB1); rb1.setOnClickListener(new RadioGroup.OnClickListener() { public void onClick(View v){ // code lancé lorsque l"utilisateur sélectionne // le premier bouton radio

© JMF (Tous droits réservés) 9

Styles et Thèmes

Un style est un ensemble de propriétés précisant l'aspect de composants graphiques (View) Il est défini dans un fichier XML séparé de l'IHM Cette notion est similaire au CSS (Cascading StyleSheets) pour le web avec la même philosophie : séparer le contenu de l'aspect De même que pour les CSS, ces informations de style sont hiérarchisées

Un thème est un style pour une Activity

Une activity ayant un thème associé transmets les indications du thème à toutes les View contenus dans l'activité source :

© JMF (Tous droits réservés) 10

Séparer contenu et aspect

Au lieu d'écrire

on écrira plutôt et les informations de style sont repérées par l'identificateur

CodeFont

CodeFont est en fait une entrée (i.e. un élement XML) dans un fichier de style android:text="@string/hello" />

© JMF (Tous droits réservés) 11

Fichier de styles

Un fichier de styles est un fichier XML de nom quelconque rangé dans res/values. Son noeud racine doit être resources. Exemple Chaque style est un élément XML style. Le nom du style est la valeur de l'attribut name. Il contient une suite de sous éléments item précisant une partie du style. Le corps de la balise item est la valeur de cet item Les styles peuvent être rangés par arborescence. On le précise par l'attribut

(optionnel) parent

© JMF (Tous droits réservés) 12

Héritage des styles

Définir une nouvelle valeur pour un attribut de style écrase l'ancienne valeur (si elle existe) pour cet attribut On peut hériter de styles prédéfinis par Android et, dans ce cas, on utilise parent comme dans : On peut hériter de ses propres styles et, dans ce cas, on utilise la notation . comme dans : Le style défini est CodeFont.Red. Il récupère les valeurs du style CodeFont. On l'utilise comme dans @style/CodeFont.Red On peut créer une arborescence de style comme CodeFont.Red.Big

© JMF (Tous droits réservés) 13

Les thèmes

Un style appliqué à un Viewgroup ne se propage pas pour les composants contenus dans le ViewGroup Un thème appliqué à une activité est propagé à tous les composants de l'activité Les indications de thème sont écrits dans le AndroidManifest.xml à l'aide l'attribut android:theme de la balise application : On peut utiliser les thèmes prédéfinis d'Android :

Les styles et thèmes proposés par Android sont accessibles à partir de http://developer.android.com/guide/topics/ui/themes.html#Platfo

rmStyles

© JMF (Tous droits réservés) 14

Composants IHM avancés

Certains composants graphiques permettent d'afficher beaucoup d'items

par des mécanismes de défilement. Ce sont :|les Spinner, les Gallery, les GridView, les ListView|Il y en a d'autres. Voir à Apis Demos | Views

© JMF (Tous droits réservés) 15

AdapterView et Adapter

Les composants graphiques qui affichent un ensemble d'items sont des

AdapterViews

Ces composants sont très utiles si les données qu'ils affichent ne sont pas connues à la création du programme mais seront chargées dynamiquement Pour fournir les items à ces composants graphiques, on utilise des Adapter Comme AdapterView est en fait AdapterView, un AdapterView est toujours associé à un

Adapter

L'Adapter sert de lien avec les données à afficher et l'AdapterView. Bref c'est le design pattern adapter Les AdapterView gèrent aussi les événements (i.e. les interactions) sur le composant graphique avec lequel ils sont associés. C'est à la fois un design pattern vue et controleur

© JMF (Tous droits réservés) 16

AdapterView, Adapter et

compagnie ! (1/2) android.widget.AdapterView est une classe abstraite générique android.widget.Adapter est une interface. Beaucoup de classes implémentent cette interface : ArrayAdapter, BaseAdapter SpinnerAdapter et ListAdapter sont des interfaces qui héritent de Adapter Spinner, Gallery, GridView, ListView sont des sous classes concrètes d'AdapterView L'association entre un AdapterView et un Adapter est faite à l'aide de la méthode public void setAdapter (T adapter) Question : Où est indiqué que le paramêtre T est un type implémentant Adapter ? Réponse : Dans la définition de la classe AdapterView

© JMF (Tous droits réservés) 17

AdapterView, Adapter et

compagnie ! (2/2)

On a donc :

© JMF (Tous droits réservés) 18

Tutoriaux pour les

AdapterView

Beaucoup de documentation existe pour les AdapterView Dans la documentation "officielle", on a des tutoriaux sur ces composants à partir de la définition de leur classe :

Spinner :

spinner.html Gallery : est, en fait, dépréciée à partir de l'API 16. Il faut utiliser des

HorizontalScrollView et des ViewPager

GridView :

idview.html

ListView :

stview.html

© JMF (Tous droits réservés) 19Spinner

C'est le composant graphique Android similaire au Combo box d'autres bibliothèques. C'est un bouton menu

Un clic sur amène

© JMF (Tous droits réservés) 20

Spinner : construction de

Les étapes sont :|1°) récupérer le composant Spinner du fichier d'IHM|2°) construire la liste des items|3°) créer l'adapter associé à cette liste|4°) associer l'adapter au Spinner

A partir de

1°) est obtenu par

© JMF (Tous droits réservés) 21

Spinner : construction de

2°) construire la liste des items est obtenu par :

3°) créer l'adapter associé à cette liste est obtenu par :

Remarque : Le format

android.R.layout.simple_spinner_item est un format donné par la bibliothèque d'Android. Ce n'est pas un fichier d'IHM de l'application. D'ailleurs il n'y a pas android.R pour les fichiers XML d'une application mais simplement R. List lsMusketeers = new ArrayList(); lsMusketeers.add("Athos"); lsMusketeers.add("Porthos"); lsMusketeers.add("Aramis");

ArrayAdapter aspnMusketeers =

new ArrayAdapter(this, android.R.layout.simple_spinner_item,lsMusketeers);

© JMF (Tous droits réservés) 22

Spinner : construction de

Le code précédent fait apparaître :

Ce n'est pas bien beau ! On ajoute plutôt

pour avoir Remarque : android.R.layout.simple_spinner_dropdown_item est aussi un format donné par la bibliothèque Android

4°) associer l'adapter au Spinner est obtenu par :

© JMF (Tous droits réservés) 23

Spinner : gestion des

événements

Le listener associé à un Spinner est un OnItemSelectedListener (et pas un OnClickListener) Être un ItemSelectedListener nécessite de donner un corps à deux méthodes : public void onItemSelected (AdapterView parent, View view, int position, long id) avec parent : l'AdapterView sur lequel l'interaction s'est produite view : le composant graphique dans l'AdapterView qui a été sélectionné position : l'indice de view dans l'AdapterView id : l'identificateur de l'item sélectionné est la méthode invoquée quand un item du Spinner est sélectionné. Elle est invoquée seulement si un nouveau choix a été fait Remarque : parent.getItemAtPosition(position) retourne la donnée associée à l'item sélectionné

© JMF (Tous droits réservés) 24

source : [3] page 197 Spinner spnMusketeers = (Spinner) findViewById(R.id.spnMusketeers); // Positionne les items du Spinner List lsMusketeers = new ArrayList(); lsMusketeers.add("Athos"); lsMusketeers.add("Porthos"); lsMusketeers.add("Aramis");

ArrayAdapter aspnMusketeers =

new ArrayAdapter(this, android.R.layout.simple_spinner_item,lsMusketeers); // gestion des événements spnMusketeers.setOnItemSelectedListener( new OnItemSelectedListener() { public void onNothingSelected(AdapterView arg0) { } public void onItemSelected(AdapterView parent, View v, int position, long id) { // code appelé lorsqu"un item est sélectionné String obj = (String)parent.getItemAtPosition(position); Toast leToast = Toast.makeText(AdapterProjetActivity.this, "item sélectionné : " + obj, Toast.LENGTH_LONG); leToast.show();

© JMF (Tous droits réservés) 25Gallery

Fait apparaître ses éléments comme des tableaux dans une gallerie (d'art)

Le défilement des items est horizontal

L'élément principal est centré et ses voisins "en arrière plan"

Est un Spinner particulier :

Voir démo projet HelloGallery

source : [3] page 198

© JMF (Tous droits réservés) 26

Les items d'une Gallery

Comme une Gallery est un AdapterView, les items d'une Gallery sont fournis par un Adapter. Comme les éléments d'une Gallery ne sont pas des String, on utilise pour cela la classe abstraite android.widget.BaseAdapter On indique le composant graphique fabriqué pour le position ième élement de l'adapter par la méthode public View getView (int position, View convertView, ViewGroup parent) où position est le numéro (commençant à 0) de l'élément dans l'adapter Pour une Gallery, la présentation "image sélectionné centrée, les voisines en arrière plan" est donné par une propriété Android Theme_galleryItemBackground. Il faut positionner cette valeur pour chaque image créée pour chaque item source : [3]

© JMF (Tous droits réservés) 27

Gallery : le code (1/6)

Il faut déjà avoir un ensemble d'images ! (à déposer dans res/drawable)

Le fichier IHM (res/layout/main.xml) contient :

L'activité qui affiche la Gallery a essentiellement pour code : android:id="@+id/gallery" android:layout_width="fill_parent" android:layout_height="wrap_content" />public class HelloGallery extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Gallery gallery = (Gallery) findViewById(R.id.gallery); gallery.setAdapter(new MonImageAdapter(this)); // ... pour un listener

© JMF (Tous droits réservés) 28

Gallery : le code (2/6)

L'adapter associé à la Gallery est donc un objet de la classe

MonImageAdapter

Pour placer chaque item de la Gallery, il faut préciser un layout. On utilise le placement prédéfini galleryItemBackground. On a alors le fichier res/values/attrs.xml qui décrit l'affichage des items

La classe MonImageAdapter commence comme :

public class ImageAdapter extends BaseAdapter { int mGalleryItemBackground; private Context mContext; private Integer[] mImageIds = {

R.drawable.sample_1, ...

© JMF (Tous droits réservés) 29

Gallery : le code (3/6)

La classe MonImageAdapter continue par son constructeur : Le contexte c est nécessaire pour d'autres méthodes de la classe Un android.content.res.TypedArray un ensemble de valeur de type de style. On récupère celle associée au style "gallery item pour l'application" et on la positionne dans la donnée membre mGalleryItemBackground Il est conseillé de toujours appeler recycle() sur un TypedArray pour une éventuelle réutilisation (c'est pas le cas ici mais bon ;-)) public MonImageAdapter(Context c) { mContext = c; TypedArray attr = mContext.obtainStyledAttributes(R.styleable.HelloGallery); mGalleryItemBackground = attr.getResourceId( R.styleable.HelloGallery_android_galleryItemBackground, 0); attr.recycle();

© JMF (Tous droits réservés) 30

Gallery : le code (4/6)

Lorsqu'on construit son propre Adapter comme ici notre MonImageAdapter pour un AdapterView, il faut indiquer le composant graphique qui sera affiché comme position ième item de cet AdapterView. Ceci est indiqué à l'aide de la méthode View getView(int position, ...) qui retourne un tel composant graphique Cette méthode getView() est appelée automatiquement par l'envirionnment d'exécution et retourne la View pour l'item d'indice position

© JMF (Tous droits réservés) 31

Gallery : le code (5/6)

Voici la méthode getView() pour la classe MonImageAdapter : Ele construit une ImageView à partir des images dans res/drawable, indique la taille de cette image 150x100 pixels, précise que l'image originelle doit être tout entière contenue dans ce rectangle 150x100 (FIT_XY), positionne un fond chatoyant pour une image, bref un cadre (par mGalleryItemBackground). Elle retourne enfin cette ImageView public View getView(int position, View convertView, ViewGroup parent) {

ImageView imageView = new ImageView(mContext);

imageView.setLayoutParams(new Gallery.LayoutParams(150, 100)); return imageView;

© JMF (Tous droits réservés) 32

Gallery : le code (6/6)

Il faut donner un corps aux méthodes getCount(), getItem(), getItemId() qui sont abstraites dans la classe de base

BaseAdapter, d'où leur code :

Question Java : pourquoi return un int convient pour retourner un

Object dans la méthode getItem() ?

public int getCount() { return mImageIds.length; public Object getItem(int position) { return position; public long getItemId(int position) { return position; Réponse : c'est l'autoboxing de Java 1.5, un objet "enveloppe" Integer est fabriqué à partir de l'int et est retourné

© JMF (Tous droits réservés) 33

Interaction sur une

Gallery

On gère les interactions utilisateurs sur une Gallery à l'aide d'un OnItemClickListener. Le code d'interaction peut être :

La méthode

public void onItemClick (AdapterView parent, View view, int position, long id) à implémenter a pour

arguments :|parent : l'AdapterView qui a reçu le clic de l'utilisateur|view : la View qui a reçu le clic|position : l'indice de cette View dans l'adapter|id : l'identifiant de la View qui a reçu le clic

gallery.setOnItemClickListener(new OnItemClickListener() { public void onItemClick(AdapterView parent, View v, int position, long id) { Toast.makeText(HelloGallery.this, "" + position, Toast.LENGTH_SHORT).show();

© JMF (Tous droits réservés) 34GridView

Fait apparaître ses éléments dans une grille (tableur) ligne-colonne Le défilement des items est horizontal ou vertical

L'arborescence des classes est :

Démo projet HelloGridView

© JMF (Tous droits réservés) 35

GridView : le code (1/2)

Il est similaire à celui de la Gallery

Le fichier IHM (res/layout/main.xml) est :

La classe MonImageAdapter commence par :

© JMF (Tous droits réservés) 36

GridView : le code (2/2)

La méthode getView() est :

// Créé une ImageView pour chaque item référencé dans l"Adapterquotesdbs_dbs13.pdfusesText_19