SlideShare a Scribd company logo
1 of 97
Download to read offline
session sept 2014 Yann Caron (c) 2014 1
IN01
Programmation Android
03 – IHM bases
Yann Caron
Avec l'aide de Jean-Marc Farinone
session sept 2014 Yann Caron (c) 2014 2
Sommaire - Séance 03
 Principes et patrons
 Combinaison ou XML
 Évènements
 Standard views
 Menus
 Intents et chaînage des activities
 Toast
session sept 2014 Yann Caron (c) 2014 3
IN01 – Séance 03
Principes et patrons
session sept 2014 Yann Caron (c) 2014 4
Les IHM des smartphones

Pas seulement clavier écran souris

Mais écran tactile, clavier virtuel

Accéléromètre

GPS

Enregistrement de messages audio (notes audio)

Prendre des photos, des vidéos, les envoyer par le réseau (MMS)

SMS

Téléphone

Etc.
Slide original (c) JMF
session sept 2014 Yann Caron (c) 2014 5
Les IHM Android

Bibliothèque propre

Pas d'AWT, ni Swing, ni Java ME/LCDUI

Décrit par fichier XML ou par composition

Écrans gérés par des activities, des fragments
et des views
Slide original (c) JMF
session sept 2014 Yann Caron (c) 2014 6
Principes

Deux grands principes == Deux arborescences
➔
Par combinaison

Les IHM sont construites en mettant les composants
graphiques les uns à l'intérieur des autres

Placement des composants
➔
Par héritage

Les composants graphiques sont obtenus par spécialisation

En général fournis par le concepteur de la bibliothèque

Utile pour créer des composants personnalisés (IDE Algoid)
Slide original (c) JMF
session sept 2014 Yann Caron (c) 2014 7
1er
principe : combinaison
Slide original (c) JMF
session sept 2014 Yann Caron (c) 2014 8
1er
principe : combinaison
Slide original (c) JMF
Activity / Fragment
Label1 FishText Label2 FamillyText
Linear Layout
Linear Layout
ButtonSave ButtonCancel
session sept 2014 Yann Caron (c) 2014 9
1er
principe : combinaison

Principe : mettre les composants les uns à
l'intérieur des autres (hiérarchiser, combiner)

Components et Containers

On obtient un arbre : être contenu par == être
fils de

Deux patrons : composite et decorator
session sept 2014 Yann Caron (c) 2014 10
Patron - Composite
Agrégation 0..n
session sept 2014 Yann Caron (c) 2014 11
Patron - Composite

Motivation : manipuler un groupe d'objets/une hiérarchie

Un composant peut être :
➔
Une feuille (un item : un composant unique)
➔
Un Composite (un node : un composant composé d'autres composants)
public abstract class Component {
public abstract void doStuff();
}
public class Composite extends Component{
private final List<Component> children = new ArrayList<Component>();
public void addChild(Component child) {
children.add(child);
}
@Override public void doStuff() {}
}
public class Leaf extends Component {
@Override public void doStuff() {}
}
Agrégation 1..*
session sept 2014 Yann Caron (c) 2014 12
Patron - Decorator
Agrégation 1..1
1
1
session sept 2014 Yann Caron (c) 2014 13
Patron - Decorator

Motivation : Ajouter dynamiquement une nouvelle responsabilité à un objet

Un composant peut être :
➔
Une feuille (un item : un composant unique)
➔
Un décorateur (un composant qui encapsule un et un seul autre)

Le décoré est généralement passé dans le constructeur (immutable)
public class Decorator extends Component {
private Component decored;
public Decorator(Component decored) {
this.decored = decored;
}
@Override public void doStuff() {
// alter before
decored.doStuff();
// alter after
}
}
Altère le comportement
session sept 2014 Yann Caron (c) 2014 14
Résumé

Le patron composite, permet de créer des vues
composées : les layouts en général (qui
héritent de l'objet ViewGroup)

Le patron decorator, permet d'altérer une vue :
ScrollView
➔
C'est un composite déguisé, qu'un seul enfant
session sept 2014 Yann Caron (c) 2014 15
2e
principe – Héritage de classes

Spécialisation des classes par héritages
successifs

Par exemple : MultiAutoCompleteTextView
session sept 2014 Yann Caron (c) 2014 16
Patron - MVC
Mediator
Observer/Observable
session sept 2014 Yann Caron (c) 2014 17
Patron - MVC

POSA : Pattern-Oriented Software Architecture

Motivation : séparer les responsabilités d'un composant graphique

Le modèle : c'est la donnée

La vue : c'est la représentation visuelle

Le contrôleur : c'est le chef d'orchestre (spécialisation du mediator)

Un excellent article :
http://www.infres.enst.fr/~hudry/coursJava/interSwing/boutons5.h
tml
session sept 2014 Yann Caron (c) 2014 18
MVC - Android

Comme vu précédemment
MVC = Model/Vue/Controler

L'idée est de séparer les données, la
présentation et les traitements

Les composants graphiques Android sont en
partie basés sur ce principe
session sept 2014 Yann Caron (c) 2014 19
Patron – Observer/Observable
session sept 2014 Yann Caron (c) 2014 20
Patron – Observer/Observable

Motivation : gestion des évènements

L'observateur est une interface qui possède une méthode

L'observateur s'abonne à l'observable (ce dernier stocke la
référence des observateurs dans une collection)

Lorsque l'observable déclenche son évènement, il boucle sur
les références et invoque les méthodes de celles-ci

Principe du callback

Sur Android, ce sont parfois des observateurs multiréférences
ou monoréférences (un seul observateur)
session sept 2014 Yann Caron (c) 2014 21
Patron – Observer/Observable
public interface Observer {
void callBack();
}
public class Observable {
private final List<Observer> observers = new ArrayList<Observer>();
public void addObserver(Observer observer) {
observers.add(observer);
}
private void fireEvent() {
for (Observer ob : observers) {
ob.callBack();
}
}
}
Agrégation
Multi-callback
Interface

Multi-callbacks
session sept 2014 Yann Caron (c) 2014 22
Patron – Observer/Observable
public interface Observer {
void callBack();
}
public class Observable {
private Observer observer;
public void setObserver(Observer observer) {
this.observer = observer;
}
private void fireEvent() {
observer.callBack();
}
}
Agrégation
Mono-callback
Interface

Mono-callbacks
session sept 2014 Yann Caron (c) 2014 23
Patron – Observer/Observable
LinearLayout container = (LinearLayout) findViewById(R.id.container);
Button button = new Button(this);
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Log.i(this.getClass().getName(), "Button clicked !");
}
});
container.addView(button);
Classe anonyme

Exemple
session sept 2014 Yann Caron (c) 2014 24
IN01 – Séance 03
Combinaison ou XML
session sept 2014 Yann Caron (c) 2014 25
IHM : types de constructions

Deux façons de construire une IHM dans
Android :
➔
En combinant les composants par programmation

Comme JavaSE Swing, AWT, JavaME
➔
En déclarant les composants dans un fichier XML

Comme JavaFX (FXML), WPF (XAML)
session sept 2014 Yann Caron (c) 2014 26
Par combinaison
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// create main layout
LinearLayout content = new LinearLayout(this);
content.setLayoutParams(
new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.MATCH_PARENT,
LinearLayout.LayoutParams.MATCH_PARENT));
content.setOrientation(LinearLayout.VERTICAL);
// add main layout to activity
this.setContentView(content);
// add controls
TextView label1 = new TextView(this);
label1.setText(getText(R.string.fish_name));
content.addView(label1);
EditText textFish = new EditText(this);
textFish.setLayoutParams(
new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.MATCH_PARENT,
LinearLayout.LayoutParams.WRAP_CONTENT));
content.addView(textFish);
// etc.
}
Layout
Content layout
Ajout des contrôles
onCreate de l'activity
session sept 2014 Yann Caron (c) 2014 27
Par combinaison

Comment ? Comme en Swing !
➔
On instancie des objets
➔
On les paramètre à l'aide des propriétés
➔
On les hiérarchise grâce à un patron composite ()
View
ViewGroup
1
0..*
session sept 2014 Yann Caron (c) 2014 28
Par combinaison

Redite :

L'IHM est décrite par programmation en surchargeant
la méthode “onCreate” de l'activity (ou du fragment)

On instancie des composants graphiques
(LinearLayout, TextView, Button, etc.)

On les paramètre (setText, setOrientation, setLayout)

On hiérarchise (content.addView) Content est le layout
auquel on ajoute une vue
session sept 2014 Yann Caron (c) 2014 29
Par combinaison

Avantages :
➔
Dynamique (construction de vues par programmation)
➔
Peut être factorisé

Inconvénients :
➔
Verbeux !
➔
Fastidieux
➔
WYSIWYG difficile à mettre en œuvre
session sept 2014 Yann Caron (c) 2014 30
Déclaration par 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:orientation="vertical" >
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/bait_name" />
<AutoCompleteTextView
android:id="@+id/autoCompleteTextView1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="AutoCompleteTextView" >
<requestFocus />
</AutoCompleteTextView>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal" >
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/global_button_save" />
</LinearLayout>
</LinearLayout>
Imbrication
session sept 2014 Yann Caron (c) 2014 31
Déclaration par XML

Le placer dans /res/layout (cf. Cours 02 pour la
gestion multirésolution, orientation, etc.)

La description d'une activity doit commencer par un
Layout

Les composants graphiques sont ensuite
hiérarchisés par encapsulation dans les nœuds XML

Les composants sont paramétrés avec des attributs
XML
session sept 2014 Yann Caron (c) 2014 32
Déclaration par XML

Avantages :
➔
WYSIWYG plus simple à mettre en place
➔
Plus lisible

Inconvénients :
➔
Limitations / bogues du WYSIWYG
➔
En mode text, autocompletion pas toujours présente
➔
Verbeux
session sept 2014 Yann Caron (c) 2014 33
Post-Scriptum - @+id vs. @id

Dans le fichier XML, on utilise parfois @+id et
parfois @id

@+id indique qu'il faut créer une nouvelle
entrée dans R.java (et sa classe interne id)

@id repère simplement l'identificateur id et il
n'y a pas de création dans R.java
Slide original (c) JMF
session sept 2014 Yann Caron (c) 2014 34
Correspondance XML-Java

Comme vu précédemment, il est possible de
décrire les vues de deux façons

Toutes les méthodes Java ont un équivalent
sous forme d'un attribut XML

La référence ce trouve ici :
http://developer.android.com/reference/androi
d/view/View.html
session sept 2014 Yann Caron (c) 2014 35
Correspondance XML-Java

Dont voici un extrait
session sept 2014 Yann Caron (c) 2014 36
Activity et XML
public class BaitActivity extends Activity {
private AutoCompleteTextView textName, textBrand;
private Button buttonSave;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.bait);
textName = (AutoCompleteTextView) findViewById(R.id.textName);
textBrand = (AutoCompleteTextView) findViewById(R.id.textBrand);
buttonSave = (Button) findViewById(R.id.buttonSave);
buttonSave.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
buttonSave_onClick(v);
}
});
}
// event handling
private void buttonSave_onClick(View v) {
// do some stuff
}
}
Accès aux contrôles
session sept 2014 Yann Caron (c) 2014 37
Activity et XML

Bonnes pratiques :
➔
Nommer correctement les composants de l'IHM
(conventions de nommage)
➔
Utiliser ces noms pour créer des attributs de la
classe activity (ou fragment)
➔
Récupérer leur instance lors de l'exécution de la
méthode onLoad
➔
Abonner des évènements si nécessaire
session sept 2014 Yann Caron (c) 2014 38
Eclipse-WYSIWYG
Drag and Drop
Propriétés
Outline
session sept 2014 Yann Caron (c) 2014 39
Eclipse-WYSIWYG

Ajout des éléments par drag and drop

Outline permet de gérer l'arborescence des
composants graphiques

Modification des propriétés dans la fenêtre
“properties”
session sept 2014 Yann Caron (c) 2014 40
IN01 – Séance 03
Évènements
session sept 2014 Yann Caron (c) 2014 41
Les évènements

Les composants émettent des évènements (patron
observer/observable)

Pour s'y abonner, deux possibilités :
➔
L'activité implémente l'interface de l'observateur (le listener)

Pas conseillé ! S'il y a plusieurs objets de même nature (bouton par
exemple) comment fait-on ?
➔
On passe l'instance d'une classe anonyme en paramètre. Sa
méthode sera exécutée lors de l'activation de l'évènement

Une bonne pratique, ne pas mettre le code directement dans la méthode
de la classe anonyme, mais on délègue à une méthode de l'activity
session sept 2014 Yann Caron (c) 2014 42
Évènements en Java - Exemple
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// manage event
buttonSave.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
buttonSave_onClick(v);
}
});
// event handling
private void buttonSave_onClick(View v) {
// do some stuff
}
Classe anonyme
Délègue à une méthode
session sept 2014 Yann Caron (c) 2014 43
Évènements – En XML

Mode déclaratif

Attribut :
android:onClick

Attention : pas
de check du
compilateur !
<Button
android:id="@+id/buttonSave"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="buttonSave_onClick"
android:text="@string/save" />
XML
// event handling
private void buttonSave_onClick(View v)
{
// do some stuff
}
Activity - Java
Nom ce l'évènement
session sept 2014 Yann Caron (c) 2014 44
IN01 – Séance 03
Standard views
session sept 2014 Yann Caron (c) 2014 45
Les composants graphiques

Ce sont les composants graphiques que voit l'utilisateur, avec lesquels il
agit sur (contrôle) l'interface graphique
➔
Appelés dans certains domaines, les contrôles
➔
En Android ce sont (par exemple) :

les zones de texte non éditables (~Label AWT) ou éditables (~TextComponent AWT) :
TextView
➔
Les boutons (~ Button AWT) : Button les zones de texte éditables (~ TextField
et TextArea de AWT) : EditText

les cases à cocher (~ Checkbox AWT) : CheckBox et les boutons radio
RadioButton à regrouper dans un ensemble

Toutes ces classes sont dans le package Android.widget et dérivent de
android.view.View
Slide original (c) JMF
session sept 2014 Yann Caron (c) 2014 46
Relation d'héritage
Object
View
ViewGroupImageView
LinearLayout
TextView
Button
1
0..*
EditText
ScrollView
FrameLayoutImageButton
CompondButton
RadioButton CheckBox
Slide original (c) JMF
session sept 2014 Yann Caron (c) 2014 47
Vue d'ensemble
session sept 2014 Yann Caron (c) 2014 48
TextView

Sert de zone de texte non éditable (~ Label AWT)

Propriétés importantes :
➔
android:text : le texte du TextView
➔
android:typeface : le type de police utilisée (monospace...)
➔
android:textStyle : le style (italic pour l'italique, bold_italic
pour gras et italique...)
➔
android:textColor pour la couleur d'affichage du texte.
Les valeurs sont en hexadécimale en unités RGB (par exemple
#FF0000 pour le rouge)
session sept 2014 Yann Caron (c) 2014 49
EditText

Sert de zone de texte éditable (~ TextField AWT)

Propriétés importantes :
➔
android:text : idem TextView
➔
android:inputType : spécifie le type d'entrée attendu
(numberDecimal, numberSigned, phone, date,
textEmailAddress, textMultiLine, textPersonName)
➔
android:hint : texte à afficher lorsque le composant
est vide
session sept 2014 Yann Caron (c) 2014 50
AutoCompleteTextView

Entre la saisie de texte et la dropdown

Propriétés importantes :
➔
android:completionThreshold :
nombre de caractères avant le déclenchement
de la dropdown

Méthodes importantes :
➔
setAdapter() : charge la liste des données utilisées pour
l'autocomplétion. La liste doit être filtrable.

Objet important :
➔
ArrayAdapter : permet d'adapter un tableau d'objets (String en général, ou
toString())
session sept 2014 Yann Caron (c) 2014 51
AutoCompleteTextView - Exemple
textName = new AutoCompleteTextView(this);
textName.setAdapter(
new ArrayAdapter<String>(
this,
android.R.layout.simple_dropdown_item_1line,
new String[] {"Brochet", "Perche", "Truite"}));
content.addView(textName);
Context
Composant utilisé
pour afficher le
text
Liste de la dropdown

Remarque : l'IDE d'Algoid est entièrement basé sur un
MultiAutoCompleteTextView. Ce dernier propose une drop
down pour chaque mot du texte (spécifier un séparateur, comme
l'espace pour du code source)
session sept 2014 Yann Caron (c) 2014 52
Spinner

Une combobox sans saisie
(~ CheckBox AWT)

Propriétés importantes :
➔
android:prompt : indicateur textuel lorsque la liste
s'affiche
➔
android:entries : spécifie les éléments de la liste
(doit faire référence à un tableau)
<string-array name="my_array">
<item>first element</item>
<item>second element</item>
</string-array>
session sept 2014 Yann Caron (c) 2014 53
Spinner

Comme l'AutoCompleteTextView
il peut utiliser un adapter

Méthodes importantes :
➔
setAdapter : charge la liste des données
Spinner spinner = (Spinner)rootView.findViewById(R.id.autoCompleteTextView1);
spinner.setAdapter(
new ArrayAdapter<String>(rootView.getContext(),
android.R.layout.simple_dropdown_item_1line,
new String[]{"Ablette", "Brochet", "Féra", "Gardon", "Omble chevalier"}));
session sept 2014 Yann Caron (c) 2014 54
Button

Un bouton (~ Button AWT)

Propriétés importantes :
➔
android:text : idem TextView
➔
android:onClick : abonne un listener sur un
évènement clic de l'utilisateur
➔
android:drawableLeft : une image à afficher avec les
textes à la position souhaitée (Top, Bottom, Left, Right)
➔
android:enable : actif ou inactif
session sept 2014 Yann Caron (c) 2014 55
CheckBox

Une case à cocher (~ CheckBox AWT)

Propriétés importantes :
➔
android:text : idem TextView
➔
android:checked : spécifie si le composant est
coché par défaut
session sept 2014 Yann Caron (c) 2014 56
RadioGroup et RadioButton

Un groupe de boutons dépendants
(~ CheckBox & CheckboxGroup AWT)
<RadioGroup
android:id="@+id/radioGroup1">
<RadioButton
android:id="@+id/radio0"
android:checked="true"
android:text="@string/radio1" />
<RadioButton
android:id="@+id/radio1"
android:text="@string/radio2" />
<RadioButton
android:id="@+id/radio2"
android:text="@string/radio3" />
</RadioGroup>

Pour que les
RadioButton soient
dépendants, il faut
qu'ils soient
contenus dans le
même groupe
session sept 2014 Yann Caron (c) 2014 57
RadioButton et évènements

Deux options :
➔
Créer un listener par RadioButton
➔
Utiliser la même méthode pour tous les
RadioButton d'un même RadioGroup. Dans la
méthode on sait quel RadioButton appelle grâce à
l'attribut View
session sept 2014 Yann Caron (c) 2014 58
RadioButton et évènements
<RadioGroup
android:id="@+id/radioGroup1">
<RadioButton
android:id="@+id/radio0"
android:checked="true"
android:onClick="radio_onClick" />
<RadioButton
android:id="@+id/radio1"
android:onClick="radio_onClick" />
<RadioButton
android:id="@+id/radio2"
android:onClick="radio_onClick" />
</RadioGroup>
XML
OnClickListener listener = new
OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
}
};
RadioGroup rg1 = (RadioGroup)
findViewById(R.id.radioGroup1);
for (int i = 0; i < rg1.getChildCount(); i++) {
RadioButton r =
(RadioButton) eg1.getChildAt(i);
r.setOnClickListener(listener);
}
Activity - Java
session sept 2014 Yann Caron (c) 2014 59
RadioButton et évènements

On teste quel bouton radio est à l'origine de
l'évènement
private void radio_onClick(View v) {
RadioButton radio = (RadioButton)view;
Log.i(this.getClass().getName(), radio.getId()+" is clicked");
switch (radio.getId()) {
case R.id.radio1:
break;
case R.id.radio2:
break;
default:
}
}
Quel radio ?
Cast la vue
session sept 2014 Yann Caron (c) 2014 60
ImageView

Affiche une image sans interaction
(cf. ImageButton)

Propriétés importantes :
➔
android:src : l'id du drawable
➔
android:scaleType : contrôle comment l'image
va être modifiée en fonction de la taille de la vue
session sept 2014 Yann Caron (c) 2014 61
ImageView - ScaleType

matrix : en haut à gauche, coupe si
nécessaire

fitXY : étire/compresse l'image en X et Y

fitStart, fitCenter, fitEnd :
réduit/agrandit en conservant les proportions

center : conserve la taille, coupée si
nécessaire et centre

centerCrop : étire/compresse l'image.
Coupe l'image si la proportion n'est pas
respectée

centerInside : centre et réduit si
nécessaire (n'agrandit pas <> fitCenter)
session sept 2014 Yann Caron (c) 2014 62
IN01 – Séance 03
Layouts
session sept 2014 Yann Caron (c) 2014 63
Définition

Des conteneurs capables de placer les
composants qu'ils contiennent de façon
automatique

Plusieurs conteneurs == plusieurs
comportements différents == plusieurs façons
de placer les composants sur la vue.
session sept 2014 Yann Caron (c) 2014 64
Relation d'héritage
Object
View
ViewGroup
LinearLayout
1
0..*
ScrollView
FrameLayout GridView
TableLayout
RelativeLayoutAbsoluteLayout
session sept 2014 Yann Caron (c) 2014 65
Vue d'ensemble

AbsoluteLayout : position absolue (x et y)

LinearLayout : les composants, les uns au-dessus des autres (ou à
côté, selon l'orientation)

RelativeLayout : la position des composants est relative aux autres

TableLayout : crée un tableau à deux dimensions organisé par
colonne et par rangée

GridLayout : grille flexible, liste d'éléments continus (de gauche à
droite)

FrameLayout : comme des “calques”, les composants les uns
derrière les autres
session sept 2014 Yann Caron (c) 2014 66
AbsoluteLayout

Placement des composants
par positionnement

Propriétés des composants :
➔
android:layout_x et
android.layout_y
session sept 2014 Yann Caron (c) 2014 67
LinearLayout

Position en colonnes ou en lignes

Deux orientations possibles grâce
à la propriété
android:layout_orientation
➔
vertical : positionne les vues les
unes au-dessus des autres
➔
horizontal : positionne les vues
les unes à côté des autres
session sept 2014 Yann Caron (c) 2014 68
LinearLayout - Remplissage

Propriétés Android :
➔
android:layout_width : comportement en largeur du
composant
➔
android:layout_height : comportement en hauteur

Valeurs de remplissage (type de comportement) :
➔
match_parent : remplit l'emplacement que lui autorise le
conteneur
➔
wrap_content : si possible, force le parent à respecter la
taille du contenu du composant
session sept 2014 Yann Caron (c) 2014 69
LinearLayout - Poids et Gravity

Poids :
➔
android:layout_weight : détermine le poids du
composant par rapport aux autres
➔
Plus le poids est important, plus le composant prend de la
place

Gravity :
➔
Gestion de l'espace vide : gère l'emplacement du composant
dans la case
➔
Propriété Android : android:layout_gravity
session sept 2014 Yann Caron (c) 2014 70
RelativeLayout

Positionne de façon relative

Relatif au composant :
➔
android:layout_below : en dessous de
➔
android:layout_above : au-dessus de

Position des bords :
➔ layout_toLeftOf, 
layout_toRightOf, 
layout_toTopOf, 
layout_toBottomOf
session sept 2014 Yann Caron (c) 2014 71
RelativeLayout

Espacement avec les composants relatifs :
➔ layout_marginTop, layout_marginLeft, 
layout_marginBottom, 
layout_marginRight

Occupation de la case :
➔ layout_width et layout_height
session sept 2014 Yann Caron (c) 2014 72
<Button
android:id="@+id/btn4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/btn3"
android:layout_toLeftOf="@id/btn3"/>
<Button
android:id="@+id/btn5"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/btn4"
android:layout_toLeftOf="@+id/btn4"/>
</RelativeLayout>
RelativeLayout - Exemple
<RelativeLayout>
<Button
android:id="@+id/btn1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:layout_marginLeft="30dp"
android:layout_marginTop="23dp"/>
<Button
android:id="@+id/btn2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/btn1"
android:layout_toRightOf="@id/btn1"/>
<Button
android:id="@+id/btn3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/btn2"
android:layout_toRightOf="@id/btn2"/>
Relatif à et aligné sur
Inutile de créer un nouvel ID
marges
session sept 2014 Yann Caron (c) 2014 73
TableLayout

Un tableau comme en HTML

Construction par colonnes et
rangées
<TableLayout>
<TableRow></TableRow>
<TableRow></TableRow>
<TableRow></TableRow>
</TableLayout>
session sept 2014 Yann Caron (c) 2014 74
TableLayout

Propriétés du tag <TableLayout> :
➔
android:shrinkColumns : colonne qui sera réduite si l'espace
devient trop petit
➔
android:stretchColumns : colonne qui sera augmentée

Propriétés du tag <TableRow> :
➔
android:paddingTop : espacement haut interne

Propriétés des composants enfants :
➔
android:layout_span : occupation du composant sur
plusieurs colonnes
session sept 2014 Yann Caron (c) 2014 75
TableLayout - Exemple
<TableLayout
android:shrinkColumns="2"
android:stretchColumns="2">
<TableRow
android:id="@+id/tableRow1"
android:paddingTop="50dp" >
<TextView android:id="@+id/textView1" />
<TextView android:id="@+id/textView2" />
<TextView android:id="@+id/textView3" />
</TableRow>
<TableRow android:id="@+id/tableRow2" >
<Button android:id="@+id/button1" />
<Button
android:id="@+id/button2"
android:layout_span="2" />
</TableRow>
</TableLayout>
Occupation
Adaptation selon la taille
Rangée
Marge intérieure
session sept 2014 Yann Caron (c) 2014 76
GridLayout

Remplit la grille de gauche à droite ou de haut
en bas

Deux orientations possibles : horizontal et
vertical

Propriétés importantes :
➔
android:columnCount : nombre de colonnes
avant retour à la ligne
➔
android:rowCount : nombre de rangées avant
retour au début
➔
android:layout_columnSpan et
android:layout_rowSpan pour gérer
l'occupation
session sept 2014 Yann Caron (c) 2014 77
FrameLayout

Permet de placer des composants
en surimpression

Des panneaux glissants

Des menus

Plus de détails au cours 05

Ou à l'adresse :
http://blog.neteril.org/blog/2013/10
/10/framelayout-your-best-ui-friend/
session sept 2014 Yann Caron (c) 2014 78
Conclusion

Framework très bien conçu !

Plus simple et plus intuitif que Swing

FrameLayout offre de grandes possibilités

Ne pas hésiter à imbriquer les layouts entre eux
(le composite est notre ami !)

Approches complémentaires : par WYSIWYG et
en XML
session sept 2014 Yann Caron (c) 2014 79
IN01 – Séance 03
Menus
session sept 2014 Yann Caron (c) 2014 80
Menus

Trois types de menus
➔
Option menu : menu standard pour naviguer dans
l'application
➔
Popup menu : les actions secondaires (après
l'option menu en général)
➔
Menu contextuel : en fonction du contenu touché
session sept 2014 Yann Caron (c) 2014 81
Menus

Accessibles depuis le bouton Menu de
l'appareil

Les menus sont placés différemment selon la
version d'Android :
➔
En bas jusqu'à Android 3.2.2 (API <= 13)
➔
En haut à droite à partir d'Android 4.0.1 (API >= 14)
session sept 2014 Yann Caron (c) 2014 82
Déclaration en XML

Il faut créer un fichier
res/menu/my_menu.xml
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
<item
android:id="@+id/menu_file"
android:showAsAction="ifRoom|withText"
android:title="@string/file">
<menu>
<item
android:id="@+id/menu_new"
android:title="@string/newf"/>
<item
android:id="@+id/menu_open"
android:title="@string/openfile"/>
</menu>
</item>
<item
android:id="@+id/menu_settings"
android:title="@string/settings"/>
</menu>
Visible dans la
barre d'action
Sous-menu
session sept 2014 Yann Caron (c) 2014 83
Dans l'activity

Les menus peuvent être différents selon les activities

On utilise la méthode onCreateOptionMenu et l'objet
MenuInflater

Les inflaters sont des objets qui créent des vues à partir de
fichiers XML
public class MainActivity extends Activity {
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
Le lien vers le fichier XMLLe menu est chargé
session sept 2014 Yann Caron (c) 2014 84
Évènement

Trois façons d'y parvenir :
➔
Redéfinir Activity.onOptionsItemSelected 
(MenuItem item)

Il faudra comparer les id avec un switch sur la méthode
item.getItemId()
➔
Dans onCreateOptionsMenu, pour chaque menuItem,
ajouter un évènement onMenuItemClickListener
➔
Dans le XML, ajouter la méthode onClick. Attention à la
signature de la méthode, elle prend comme paramètre un
MenuItem et non une View
session sept 2014 Yann Caron (c) 2014 85
onOptionItemSelected
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
switch (id) {
case (R.id.action_example):
// menu example
return true;
case (R.id.action_settings):
// mennu settings
return true;
default:
return super.onOptionsItemSelected(item);
}
} Cascade l'appel avec la super class
Le menu est chargé
session sept 2014 Yann Caron (c) 2014 86
onOptionItemSelected
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
MenuItem item1 = menu.findItem(R.id.action_example);
item1.setOnMenuItemClickListener(new OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
// menu example
return true;
}
});
MenuItem item2 = menu.findItem(R.id.action_settings);
item2.setOnMenuItemClickListener(new OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
// menu settings
return true;
}
});
return true;
}
Un évènement pour chaque MenuItem
session sept 2014 Yann Caron (c) 2014 87
ActionBar

Depuis la version 11 de l'API (Android 3.0
HoneyComb) il est possible de sortir certains
MenuItems pour un accès direct dans la barre
d'action. Il faut utiliser le paramètre
android:showAsAction
session sept 2014 Yann Caron (c) 2014 88
Onglets

API >= 11 ou
appCompatv7

On peut créer
une navigation
avec des onglets
(NAVIGATION_M
ODE_TABS)
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.bait);
ActionBar actionBar = getActionBar();
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
ActionBar.Tab tab1 = actionBar.newTab();
tab1.setText("Fishes");
tab1.setTabListener(new TabListener() {
@Override
public void onTabUnselected(Tab tab, FragmentTransaction ft) {
// Do some stuff
}
@Override
public void onTabSelected(Tab tab, FragmentTransaction ft) {
// Do some stuff
}
@Override
public void onTabReselected(Tab tab, FragmentTransaction ft) {
// Do some stuff
}
});
actionBar.addTab(tab1);
// etc.
}
Callback obligatoire
session sept 2014 Yann Caron (c) 2014 89
PopupMenu

API >= 11 ou appCompatv7
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.bait);
final Button bt = (Button)findViewById(R.id.buttonMenu);
bt.setText("Popup Menu ....");
bt.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
PopupMenu menu = new PopupMenu(MainActivity2.this, bt);
MenuInflater inflater = menu.getMenuInflater();
inflater.inflate(R.menu.main, menu.getMenu());
menu.show();
}
});
}
Création du menu popup
session sept 2014 Yann Caron (c) 2014 90
MenuContextuel
callback = new Callback() {
@Override
public boolean onCreateActionMode(ActionMode mode, Menu menu) {
// création
MenuInflater inflater = MainActivity2.this.getMenuInflater();
inflater.inflate(R.menu.main, menu);;
return true;
}
@Override
public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
// appelé juste avant la création du menu
return false;
}
@Override
public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
// Récupérer les évènements
return false;
}
@Override
public void onDestroyActionMode(ActionMode mode) {
// appelé à la destruction de celui-ci
}
};
TextView bait = (TextView)findViewById(R.id.textBait);
bait.setOnLongClickListener(new OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
actionMode = MainActivity2.this.startActionMode(callback);
return true;
}
});
Création du menu
Démarre le menu
Évènements clic
session sept 2014 Yann Caron (c) 2014 91
IN01 – Séance 03
Intents et chaînage des activities
session sept 2014 Yann Caron (c) 2014 92
Intent

Une intent (intention) est une description
abstraite d'une action à effectuer par l'appareil

Message asynchrone interprocessus

Interagir avec des composants internes et
externes à l'application

Classe abstraite : android.content.Intent
session sept 2014 Yann Caron (c) 2014 93
Chaînage des écrans

Pour passer d'un écran à un autre, on utilise
une intention :

On n'oublie pas de déclarer la nouvelle activity
dans le manifest
Intent intent = new Intent(this, MainActivity2.class);
startActivity(intent);
<activity
android:name="fr.cnam.pecheurduleman.MainActivity2"
android:label="@string/global_app_name">
</activity>
session sept 2014 Yann Caron (c) 2014 94
Passage de données entre activities

Les intents permettent de passer des
informations grâce à la méthode putExtra()

Que l'on récupère dans la nouvelle activity :
Intent i = new Intent(this, MainActivity2.class);
i.putExtra("myExtra1", "myStringValue");
i.putExtra("myExtra2", 10);
startActivity(i);
String myExtra1 = getIntent().getExtras().getString("myExtra1", "default");
int myExtra2 = getIntent().getExtras().getInt("myExtra2", 0);
Valeur par défaut
session sept 2014 Yann Caron (c) 2014 95
IN01 – Séance 03
Toast
session sept 2014 Yann Caron (c) 2014 96
Toast

Une fenêtre de dialogue qui affiche un message
pendant 2 (Toast.LENGTH_SHORT) ou 5
(Toast.LENGTH_LONG) secondes est un
composant graphique Android : le Toast

Attention construire le Toast ne l'affiche pas : il faut
utiliser show() pour cela
Slide original (c) JMF
Toast leToast = Toast.makeText(this, "texteAAfficher", Toast.LENGTH_LONG);
leToast.show();
session sept 2014 Yann Caron (c) 2014 97
Fin
 Merci de votre attention
 Des questions ?

More Related Content

What's hot

Programmation Android - 02 - Android
Programmation Android - 02 - AndroidProgrammation Android - 02 - Android
Programmation Android - 02 - AndroidYann Caron
 
Programmation Android - 06 - Publication
Programmation Android - 06 - PublicationProgrammation Android - 06 - Publication
Programmation Android - 06 - PublicationYann Caron
 
Programmation Android - 00 - Présentation
Programmation Android - 00 - PrésentationProgrammation Android - 00 - Présentation
Programmation Android - 00 - PrésentationYann Caron
 
Programmation Android - 04 - Databases
Programmation Android - 04 - DatabasesProgrammation Android - 04 - Databases
Programmation Android - 04 - DatabasesYann Caron
 
Programmation Android - 05 - Google map
Programmation Android - 05 - Google mapProgrammation Android - 05 - Google map
Programmation Android - 05 - Google mapYann Caron
 
Programmation Android - 09 - Web services
Programmation Android - 09 - Web servicesProgrammation Android - 09 - Web services
Programmation Android - 09 - Web servicesYann Caron
 
Programmation Android - 03 - IHM bases
Programmation Android - 03 - IHM basesProgrammation Android - 03 - IHM bases
Programmation Android - 03 - IHM basesYann Caron
 
Programmation Android 07 - Techniques avancées
Programmation Android 07 - Techniques avancéesProgrammation Android 07 - Techniques avancées
Programmation Android 07 - Techniques avancéesYann Caron
 
Programmation Android - 10 - Spatialite
Programmation Android - 10 - SpatialiteProgrammation Android - 10 - Spatialite
Programmation Android - 10 - SpatialiteYann Caron
 
In01 - Programmation Android - 01 - introduction
In01 - Programmation Android - 01 - introductionIn01 - Programmation Android - 01 - introduction
In01 - Programmation Android - 01 - introductionYann Caron
 
Applications Android - cours 5 : Classe Object et Collections en Java
Applications Android - cours 5 : Classe Object et Collections en JavaApplications Android - cours 5 : Classe Object et Collections en Java
Applications Android - cours 5 : Classe Object et Collections en JavaAhmed-Chawki Chaouche
 
Mise en place de l'ActionBarCompat dans vos projets Android.
Mise en place de l'ActionBarCompat dans vos projets Android.Mise en place de l'ActionBarCompat dans vos projets Android.
Mise en place de l'ActionBarCompat dans vos projets Android.Mathias Seguy
 
Applications Android - cours 6 : Structure d’un projet Android
Applications Android - cours 6 :  Structure d’un projet AndroidApplications Android - cours 6 :  Structure d’un projet Android
Applications Android - cours 6 : Structure d’un projet AndroidAhmed-Chawki Chaouche
 

What's hot (13)

Programmation Android - 02 - Android
Programmation Android - 02 - AndroidProgrammation Android - 02 - Android
Programmation Android - 02 - Android
 
Programmation Android - 06 - Publication
Programmation Android - 06 - PublicationProgrammation Android - 06 - Publication
Programmation Android - 06 - Publication
 
Programmation Android - 00 - Présentation
Programmation Android - 00 - PrésentationProgrammation Android - 00 - Présentation
Programmation Android - 00 - Présentation
 
Programmation Android - 04 - Databases
Programmation Android - 04 - DatabasesProgrammation Android - 04 - Databases
Programmation Android - 04 - Databases
 
Programmation Android - 05 - Google map
Programmation Android - 05 - Google mapProgrammation Android - 05 - Google map
Programmation Android - 05 - Google map
 
Programmation Android - 09 - Web services
Programmation Android - 09 - Web servicesProgrammation Android - 09 - Web services
Programmation Android - 09 - Web services
 
Programmation Android - 03 - IHM bases
Programmation Android - 03 - IHM basesProgrammation Android - 03 - IHM bases
Programmation Android - 03 - IHM bases
 
Programmation Android 07 - Techniques avancées
Programmation Android 07 - Techniques avancéesProgrammation Android 07 - Techniques avancées
Programmation Android 07 - Techniques avancées
 
Programmation Android - 10 - Spatialite
Programmation Android - 10 - SpatialiteProgrammation Android - 10 - Spatialite
Programmation Android - 10 - Spatialite
 
In01 - Programmation Android - 01 - introduction
In01 - Programmation Android - 01 - introductionIn01 - Programmation Android - 01 - introduction
In01 - Programmation Android - 01 - introduction
 
Applications Android - cours 5 : Classe Object et Collections en Java
Applications Android - cours 5 : Classe Object et Collections en JavaApplications Android - cours 5 : Classe Object et Collections en Java
Applications Android - cours 5 : Classe Object et Collections en Java
 
Mise en place de l'ActionBarCompat dans vos projets Android.
Mise en place de l'ActionBarCompat dans vos projets Android.Mise en place de l'ActionBarCompat dans vos projets Android.
Mise en place de l'ActionBarCompat dans vos projets Android.
 
Applications Android - cours 6 : Structure d’un projet Android
Applications Android - cours 6 :  Structure d’un projet AndroidApplications Android - cours 6 :  Structure d’un projet Android
Applications Android - cours 6 : Structure d’un projet Android
 

Similar to In01 - Programmation Android - 03 - HMI

Application Spring MVC/IOC & Hibernate
Application Spring MVC/IOC & HibernateApplication Spring MVC/IOC & Hibernate
Application Spring MVC/IOC & HibernateInes Ouaz
 
Framework Hibernate
Framework HibernateFramework Hibernate
Framework HibernateInes Ouaz
 
Open close principle, on a dit étendre, pas extends !
Open close principle, on a dit étendre, pas extends !Open close principle, on a dit étendre, pas extends !
Open close principle, on a dit étendre, pas extends !Engineor
 
Alphorm.com Formation React : Les fondamentaux
Alphorm.com Formation React : Les fondamentauxAlphorm.com Formation React : Les fondamentaux
Alphorm.com Formation React : Les fondamentauxAlphorm
 
chapitre-2-les-activites.pdf
chapitre-2-les-activites.pdfchapitre-2-les-activites.pdf
chapitre-2-les-activites.pdfolfaharrabi2
 
chapitre-2-les-activites.pdf
chapitre-2-les-activites.pdfchapitre-2-les-activites.pdf
chapitre-2-les-activites.pdfferiel53
 
programmation orienté objet c++
programmation orienté objet c++programmation orienté objet c++
programmation orienté objet c++coursuniv
 
Soutenance Zend Framework vs Symfony
Soutenance Zend Framework vs SymfonySoutenance Zend Framework vs Symfony
Soutenance Zend Framework vs SymfonyVincent Composieux
 
Java- LT informatique
Java-  LT informatiqueJava-  LT informatique
Java- LT informatiqueHassanChaaban
 
#J2Code2018 - Mettez du feu à vos applications avec CodeIgniter
#J2Code2018 - Mettez du feu à vos applications avec CodeIgniter#J2Code2018 - Mettez du feu à vos applications avec CodeIgniter
#J2Code2018 - Mettez du feu à vos applications avec CodeIgniterAtsé François-Xavier KOBON
 
cours-gratuit.com--id-12477.pdf
cours-gratuit.com--id-12477.pdfcours-gratuit.com--id-12477.pdf
cours-gratuit.com--id-12477.pdfssuser192642
 
Play framework - Human Talks Grenoble - 12.02.2013
Play framework - Human Talks Grenoble - 12.02.2013Play framework - Human Talks Grenoble - 12.02.2013
Play framework - Human Talks Grenoble - 12.02.2013Xavier NOPRE
 
react-slides.ppx (2) (1).pptx react presentation basic
react-slides.ppx (2) (1).pptx react presentation basicreact-slides.ppx (2) (1).pptx react presentation basic
react-slides.ppx (2) (1).pptx react presentation basiczineblahib2
 
Qualité logicielle
Qualité logicielleQualité logicielle
Qualité logiciellecyrilgandon
 
Formation JAVA/J2EE
Formation JAVA/J2EEFormation JAVA/J2EE
Formation JAVA/J2EEInes Ouaz
 
Hibernate : comment déclarer une entité avec les annotations ?
Hibernate : comment déclarer une entité avec les annotations ?Hibernate : comment déclarer une entité avec les annotations ?
Hibernate : comment déclarer une entité avec les annotations ?ProfLibre
 
Hibernate : vue d’ensemble
Hibernate : vue d’ensembleHibernate : vue d’ensemble
Hibernate : vue d’ensembleProfLibre
 

Similar to In01 - Programmation Android - 03 - HMI (20)

Les Activités.pdf
Les Activités.pdfLes Activités.pdf
Les Activités.pdf
 
Application Spring MVC/IOC & Hibernate
Application Spring MVC/IOC & HibernateApplication Spring MVC/IOC & Hibernate
Application Spring MVC/IOC & Hibernate
 
Framework Hibernate
Framework HibernateFramework Hibernate
Framework Hibernate
 
Open close principle, on a dit étendre, pas extends !
Open close principle, on a dit étendre, pas extends !Open close principle, on a dit étendre, pas extends !
Open close principle, on a dit étendre, pas extends !
 
Alphorm.com Formation React : Les fondamentaux
Alphorm.com Formation React : Les fondamentauxAlphorm.com Formation React : Les fondamentaux
Alphorm.com Formation React : Les fondamentaux
 
chapitre-2-les-activites.pdf
chapitre-2-les-activites.pdfchapitre-2-les-activites.pdf
chapitre-2-les-activites.pdf
 
chapitre-2-les-activites.pdf
chapitre-2-les-activites.pdfchapitre-2-les-activites.pdf
chapitre-2-les-activites.pdf
 
programmation orienté objet c++
programmation orienté objet c++programmation orienté objet c++
programmation orienté objet c++
 
Soutenance Zend Framework vs Symfony
Soutenance Zend Framework vs SymfonySoutenance Zend Framework vs Symfony
Soutenance Zend Framework vs Symfony
 
Java- LT informatique
Java-  LT informatiqueJava-  LT informatique
Java- LT informatique
 
#J2Code2018 - Mettez du feu à vos applications avec CodeIgniter
#J2Code2018 - Mettez du feu à vos applications avec CodeIgniter#J2Code2018 - Mettez du feu à vos applications avec CodeIgniter
#J2Code2018 - Mettez du feu à vos applications avec CodeIgniter
 
cours-gratuit.com--id-12477.pdf
cours-gratuit.com--id-12477.pdfcours-gratuit.com--id-12477.pdf
cours-gratuit.com--id-12477.pdf
 
DART.pptx
DART.pptxDART.pptx
DART.pptx
 
Play framework - Human Talks Grenoble - 12.02.2013
Play framework - Human Talks Grenoble - 12.02.2013Play framework - Human Talks Grenoble - 12.02.2013
Play framework - Human Talks Grenoble - 12.02.2013
 
react-slides.ppx (2) (1).pptx react presentation basic
react-slides.ppx (2) (1).pptx react presentation basicreact-slides.ppx (2) (1).pptx react presentation basic
react-slides.ppx (2) (1).pptx react presentation basic
 
Qualité logicielle
Qualité logicielleQualité logicielle
Qualité logicielle
 
Formation JAVA/J2EE
Formation JAVA/J2EEFormation JAVA/J2EE
Formation JAVA/J2EE
 
Hibernate : comment déclarer une entité avec les annotations ?
Hibernate : comment déclarer une entité avec les annotations ?Hibernate : comment déclarer une entité avec les annotations ?
Hibernate : comment déclarer une entité avec les annotations ?
 
5.ateliers avancés
5.ateliers avancés5.ateliers avancés
5.ateliers avancés
 
Hibernate : vue d’ensemble
Hibernate : vue d’ensembleHibernate : vue d’ensemble
Hibernate : vue d’ensemble
 

More from Yann Caron

Théorie des langages - TP - WellKnownText
Théorie des langages - TP  - WellKnownTextThéorie des langages - TP  - WellKnownText
Théorie des langages - TP - WellKnownTextYann Caron
 
Théorie des langages - 04 Théorie des langages
Théorie des langages - 04 Théorie des langagesThéorie des langages - 04 Théorie des langages
Théorie des langages - 04 Théorie des langagesYann Caron
 
Théorie des langages - 03 - Principes et paradigmes
Théorie des langages - 03 - Principes et paradigmesThéorie des langages - 03 - Principes et paradigmes
Théorie des langages - 03 - Principes et paradigmesYann Caron
 
Théorie des langages - 02 - Code gen
Théorie des langages - 02 - Code genThéorie des langages - 02 - Code gen
Théorie des langages - 02 - Code genYann Caron
 
Théorie des langages - 01.1 - Parcours d'arbres
Théorie des langages - 01.1 - Parcours d'arbresThéorie des langages - 01.1 - Parcours d'arbres
Théorie des langages - 01.1 - Parcours d'arbresYann Caron
 
Théorie des langages - 01 - Compilation
Théorie des langages - 01 - CompilationThéorie des langages - 01 - Compilation
Théorie des langages - 01 - CompilationYann Caron
 
Théorie des langages - 00 - Introduction
Théorie des langages - 00 - IntroductionThéorie des langages - 00 - Introduction
Théorie des langages - 00 - IntroductionYann Caron
 
Algea - 04 - conclusion
Algea - 04 - conclusionAlgea - 04 - conclusion
Algea - 04 - conclusionYann Caron
 
Algea - 03 - ennemis
Algea - 03 - ennemisAlgea - 03 - ennemis
Algea - 03 - ennemisYann Caron
 
Algea - 02 - gemmes
Algea - 02 - gemmesAlgea - 02 - gemmes
Algea - 02 - gemmesYann Caron
 
Algea - 01 - hero
Algea - 01 - heroAlgea - 01 - hero
Algea - 01 - heroYann Caron
 
ALGEA - 00 - introduction
ALGEA - 00 - introductionALGEA - 00 - introduction
ALGEA - 00 - introductionYann Caron
 
Programmation Android - 08 - Android debug bridge
Programmation Android - 08 - Android debug bridgeProgrammation Android - 08 - Android debug bridge
Programmation Android - 08 - Android debug bridgeYann Caron
 
Cours CNAM In01 - Programmation Android - Septembre 2014
Cours CNAM In01 - Programmation Android - Septembre 2014Cours CNAM In01 - Programmation Android - Septembre 2014
Cours CNAM In01 - Programmation Android - Septembre 2014Yann Caron
 

More from Yann Caron (14)

Théorie des langages - TP - WellKnownText
Théorie des langages - TP  - WellKnownTextThéorie des langages - TP  - WellKnownText
Théorie des langages - TP - WellKnownText
 
Théorie des langages - 04 Théorie des langages
Théorie des langages - 04 Théorie des langagesThéorie des langages - 04 Théorie des langages
Théorie des langages - 04 Théorie des langages
 
Théorie des langages - 03 - Principes et paradigmes
Théorie des langages - 03 - Principes et paradigmesThéorie des langages - 03 - Principes et paradigmes
Théorie des langages - 03 - Principes et paradigmes
 
Théorie des langages - 02 - Code gen
Théorie des langages - 02 - Code genThéorie des langages - 02 - Code gen
Théorie des langages - 02 - Code gen
 
Théorie des langages - 01.1 - Parcours d'arbres
Théorie des langages - 01.1 - Parcours d'arbresThéorie des langages - 01.1 - Parcours d'arbres
Théorie des langages - 01.1 - Parcours d'arbres
 
Théorie des langages - 01 - Compilation
Théorie des langages - 01 - CompilationThéorie des langages - 01 - Compilation
Théorie des langages - 01 - Compilation
 
Théorie des langages - 00 - Introduction
Théorie des langages - 00 - IntroductionThéorie des langages - 00 - Introduction
Théorie des langages - 00 - Introduction
 
Algea - 04 - conclusion
Algea - 04 - conclusionAlgea - 04 - conclusion
Algea - 04 - conclusion
 
Algea - 03 - ennemis
Algea - 03 - ennemisAlgea - 03 - ennemis
Algea - 03 - ennemis
 
Algea - 02 - gemmes
Algea - 02 - gemmesAlgea - 02 - gemmes
Algea - 02 - gemmes
 
Algea - 01 - hero
Algea - 01 - heroAlgea - 01 - hero
Algea - 01 - hero
 
ALGEA - 00 - introduction
ALGEA - 00 - introductionALGEA - 00 - introduction
ALGEA - 00 - introduction
 
Programmation Android - 08 - Android debug bridge
Programmation Android - 08 - Android debug bridgeProgrammation Android - 08 - Android debug bridge
Programmation Android - 08 - Android debug bridge
 
Cours CNAM In01 - Programmation Android - Septembre 2014
Cours CNAM In01 - Programmation Android - Septembre 2014Cours CNAM In01 - Programmation Android - Septembre 2014
Cours CNAM In01 - Programmation Android - Septembre 2014
 

In01 - Programmation Android - 03 - HMI

  • 1. session sept 2014 Yann Caron (c) 2014 1 IN01 Programmation Android 03 – IHM bases Yann Caron Avec l'aide de Jean-Marc Farinone
  • 2. session sept 2014 Yann Caron (c) 2014 2 Sommaire - Séance 03  Principes et patrons  Combinaison ou XML  Évènements  Standard views  Menus  Intents et chaînage des activities  Toast
  • 3. session sept 2014 Yann Caron (c) 2014 3 IN01 – Séance 03 Principes et patrons
  • 4. session sept 2014 Yann Caron (c) 2014 4 Les IHM des smartphones  Pas seulement clavier écran souris  Mais écran tactile, clavier virtuel  Accéléromètre  GPS  Enregistrement de messages audio (notes audio)  Prendre des photos, des vidéos, les envoyer par le réseau (MMS)  SMS  Téléphone  Etc. Slide original (c) JMF
  • 5. session sept 2014 Yann Caron (c) 2014 5 Les IHM Android  Bibliothèque propre  Pas d'AWT, ni Swing, ni Java ME/LCDUI  Décrit par fichier XML ou par composition  Écrans gérés par des activities, des fragments et des views Slide original (c) JMF
  • 6. session sept 2014 Yann Caron (c) 2014 6 Principes  Deux grands principes == Deux arborescences ➔ Par combinaison  Les IHM sont construites en mettant les composants graphiques les uns à l'intérieur des autres  Placement des composants ➔ Par héritage  Les composants graphiques sont obtenus par spécialisation  En général fournis par le concepteur de la bibliothèque  Utile pour créer des composants personnalisés (IDE Algoid) Slide original (c) JMF
  • 7. session sept 2014 Yann Caron (c) 2014 7 1er principe : combinaison Slide original (c) JMF
  • 8. session sept 2014 Yann Caron (c) 2014 8 1er principe : combinaison Slide original (c) JMF Activity / Fragment Label1 FishText Label2 FamillyText Linear Layout Linear Layout ButtonSave ButtonCancel
  • 9. session sept 2014 Yann Caron (c) 2014 9 1er principe : combinaison  Principe : mettre les composants les uns à l'intérieur des autres (hiérarchiser, combiner)  Components et Containers  On obtient un arbre : être contenu par == être fils de  Deux patrons : composite et decorator
  • 10. session sept 2014 Yann Caron (c) 2014 10 Patron - Composite Agrégation 0..n
  • 11. session sept 2014 Yann Caron (c) 2014 11 Patron - Composite  Motivation : manipuler un groupe d'objets/une hiérarchie  Un composant peut être : ➔ Une feuille (un item : un composant unique) ➔ Un Composite (un node : un composant composé d'autres composants) public abstract class Component { public abstract void doStuff(); } public class Composite extends Component{ private final List<Component> children = new ArrayList<Component>(); public void addChild(Component child) { children.add(child); } @Override public void doStuff() {} } public class Leaf extends Component { @Override public void doStuff() {} } Agrégation 1..*
  • 12. session sept 2014 Yann Caron (c) 2014 12 Patron - Decorator Agrégation 1..1 1 1
  • 13. session sept 2014 Yann Caron (c) 2014 13 Patron - Decorator  Motivation : Ajouter dynamiquement une nouvelle responsabilité à un objet  Un composant peut être : ➔ Une feuille (un item : un composant unique) ➔ Un décorateur (un composant qui encapsule un et un seul autre)  Le décoré est généralement passé dans le constructeur (immutable) public class Decorator extends Component { private Component decored; public Decorator(Component decored) { this.decored = decored; } @Override public void doStuff() { // alter before decored.doStuff(); // alter after } } Altère le comportement
  • 14. session sept 2014 Yann Caron (c) 2014 14 Résumé  Le patron composite, permet de créer des vues composées : les layouts en général (qui héritent de l'objet ViewGroup)  Le patron decorator, permet d'altérer une vue : ScrollView ➔ C'est un composite déguisé, qu'un seul enfant
  • 15. session sept 2014 Yann Caron (c) 2014 15 2e principe – Héritage de classes  Spécialisation des classes par héritages successifs  Par exemple : MultiAutoCompleteTextView
  • 16. session sept 2014 Yann Caron (c) 2014 16 Patron - MVC Mediator Observer/Observable
  • 17. session sept 2014 Yann Caron (c) 2014 17 Patron - MVC  POSA : Pattern-Oriented Software Architecture  Motivation : séparer les responsabilités d'un composant graphique  Le modèle : c'est la donnée  La vue : c'est la représentation visuelle  Le contrôleur : c'est le chef d'orchestre (spécialisation du mediator)  Un excellent article : http://www.infres.enst.fr/~hudry/coursJava/interSwing/boutons5.h tml
  • 18. session sept 2014 Yann Caron (c) 2014 18 MVC - Android  Comme vu précédemment MVC = Model/Vue/Controler  L'idée est de séparer les données, la présentation et les traitements  Les composants graphiques Android sont en partie basés sur ce principe
  • 19. session sept 2014 Yann Caron (c) 2014 19 Patron – Observer/Observable
  • 20. session sept 2014 Yann Caron (c) 2014 20 Patron – Observer/Observable  Motivation : gestion des évènements  L'observateur est une interface qui possède une méthode  L'observateur s'abonne à l'observable (ce dernier stocke la référence des observateurs dans une collection)  Lorsque l'observable déclenche son évènement, il boucle sur les références et invoque les méthodes de celles-ci  Principe du callback  Sur Android, ce sont parfois des observateurs multiréférences ou monoréférences (un seul observateur)
  • 21. session sept 2014 Yann Caron (c) 2014 21 Patron – Observer/Observable public interface Observer { void callBack(); } public class Observable { private final List<Observer> observers = new ArrayList<Observer>(); public void addObserver(Observer observer) { observers.add(observer); } private void fireEvent() { for (Observer ob : observers) { ob.callBack(); } } } Agrégation Multi-callback Interface  Multi-callbacks
  • 22. session sept 2014 Yann Caron (c) 2014 22 Patron – Observer/Observable public interface Observer { void callBack(); } public class Observable { private Observer observer; public void setObserver(Observer observer) { this.observer = observer; } private void fireEvent() { observer.callBack(); } } Agrégation Mono-callback Interface  Mono-callbacks
  • 23. session sept 2014 Yann Caron (c) 2014 23 Patron – Observer/Observable LinearLayout container = (LinearLayout) findViewById(R.id.container); Button button = new Button(this); button.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Log.i(this.getClass().getName(), "Button clicked !"); } }); container.addView(button); Classe anonyme  Exemple
  • 24. session sept 2014 Yann Caron (c) 2014 24 IN01 – Séance 03 Combinaison ou XML
  • 25. session sept 2014 Yann Caron (c) 2014 25 IHM : types de constructions  Deux façons de construire une IHM dans Android : ➔ En combinant les composants par programmation  Comme JavaSE Swing, AWT, JavaME ➔ En déclarant les composants dans un fichier XML  Comme JavaFX (FXML), WPF (XAML)
  • 26. session sept 2014 Yann Caron (c) 2014 26 Par combinaison @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // create main layout LinearLayout content = new LinearLayout(this); content.setLayoutParams( new LinearLayout.LayoutParams( LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT)); content.setOrientation(LinearLayout.VERTICAL); // add main layout to activity this.setContentView(content); // add controls TextView label1 = new TextView(this); label1.setText(getText(R.string.fish_name)); content.addView(label1); EditText textFish = new EditText(this); textFish.setLayoutParams( new LinearLayout.LayoutParams( LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT)); content.addView(textFish); // etc. } Layout Content layout Ajout des contrôles onCreate de l'activity
  • 27. session sept 2014 Yann Caron (c) 2014 27 Par combinaison  Comment ? Comme en Swing ! ➔ On instancie des objets ➔ On les paramètre à l'aide des propriétés ➔ On les hiérarchise grâce à un patron composite () View ViewGroup 1 0..*
  • 28. session sept 2014 Yann Caron (c) 2014 28 Par combinaison  Redite :  L'IHM est décrite par programmation en surchargeant la méthode “onCreate” de l'activity (ou du fragment)  On instancie des composants graphiques (LinearLayout, TextView, Button, etc.)  On les paramètre (setText, setOrientation, setLayout)  On hiérarchise (content.addView) Content est le layout auquel on ajoute une vue
  • 29. session sept 2014 Yann Caron (c) 2014 29 Par combinaison  Avantages : ➔ Dynamique (construction de vues par programmation) ➔ Peut être factorisé  Inconvénients : ➔ Verbeux ! ➔ Fastidieux ➔ WYSIWYG difficile à mettre en œuvre
  • 30. session sept 2014 Yann Caron (c) 2014 30 Déclaration par 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:orientation="vertical" > <TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/bait_name" /> <AutoCompleteTextView android:id="@+id/autoCompleteTextView1" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="AutoCompleteTextView" > <requestFocus /> </AutoCompleteTextView> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center_horizontal" > <Button android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/global_button_save" /> </LinearLayout> </LinearLayout> Imbrication
  • 31. session sept 2014 Yann Caron (c) 2014 31 Déclaration par XML  Le placer dans /res/layout (cf. Cours 02 pour la gestion multirésolution, orientation, etc.)  La description d'une activity doit commencer par un Layout  Les composants graphiques sont ensuite hiérarchisés par encapsulation dans les nœuds XML  Les composants sont paramétrés avec des attributs XML
  • 32. session sept 2014 Yann Caron (c) 2014 32 Déclaration par XML  Avantages : ➔ WYSIWYG plus simple à mettre en place ➔ Plus lisible  Inconvénients : ➔ Limitations / bogues du WYSIWYG ➔ En mode text, autocompletion pas toujours présente ➔ Verbeux
  • 33. session sept 2014 Yann Caron (c) 2014 33 Post-Scriptum - @+id vs. @id  Dans le fichier XML, on utilise parfois @+id et parfois @id  @+id indique qu'il faut créer une nouvelle entrée dans R.java (et sa classe interne id)  @id repère simplement l'identificateur id et il n'y a pas de création dans R.java Slide original (c) JMF
  • 34. session sept 2014 Yann Caron (c) 2014 34 Correspondance XML-Java  Comme vu précédemment, il est possible de décrire les vues de deux façons  Toutes les méthodes Java ont un équivalent sous forme d'un attribut XML  La référence ce trouve ici : http://developer.android.com/reference/androi d/view/View.html
  • 35. session sept 2014 Yann Caron (c) 2014 35 Correspondance XML-Java  Dont voici un extrait
  • 36. session sept 2014 Yann Caron (c) 2014 36 Activity et XML public class BaitActivity extends Activity { private AutoCompleteTextView textName, textBrand; private Button buttonSave; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.bait); textName = (AutoCompleteTextView) findViewById(R.id.textName); textBrand = (AutoCompleteTextView) findViewById(R.id.textBrand); buttonSave = (Button) findViewById(R.id.buttonSave); buttonSave.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { buttonSave_onClick(v); } }); } // event handling private void buttonSave_onClick(View v) { // do some stuff } } Accès aux contrôles
  • 37. session sept 2014 Yann Caron (c) 2014 37 Activity et XML  Bonnes pratiques : ➔ Nommer correctement les composants de l'IHM (conventions de nommage) ➔ Utiliser ces noms pour créer des attributs de la classe activity (ou fragment) ➔ Récupérer leur instance lors de l'exécution de la méthode onLoad ➔ Abonner des évènements si nécessaire
  • 38. session sept 2014 Yann Caron (c) 2014 38 Eclipse-WYSIWYG Drag and Drop Propriétés Outline
  • 39. session sept 2014 Yann Caron (c) 2014 39 Eclipse-WYSIWYG  Ajout des éléments par drag and drop  Outline permet de gérer l'arborescence des composants graphiques  Modification des propriétés dans la fenêtre “properties”
  • 40. session sept 2014 Yann Caron (c) 2014 40 IN01 – Séance 03 Évènements
  • 41. session sept 2014 Yann Caron (c) 2014 41 Les évènements  Les composants émettent des évènements (patron observer/observable)  Pour s'y abonner, deux possibilités : ➔ L'activité implémente l'interface de l'observateur (le listener)  Pas conseillé ! S'il y a plusieurs objets de même nature (bouton par exemple) comment fait-on ? ➔ On passe l'instance d'une classe anonyme en paramètre. Sa méthode sera exécutée lors de l'activation de l'évènement  Une bonne pratique, ne pas mettre le code directement dans la méthode de la classe anonyme, mais on délègue à une méthode de l'activity
  • 42. session sept 2014 Yann Caron (c) 2014 42 Évènements en Java - Exemple @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // manage event buttonSave.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { buttonSave_onClick(v); } }); // event handling private void buttonSave_onClick(View v) { // do some stuff } Classe anonyme Délègue à une méthode
  • 43. session sept 2014 Yann Caron (c) 2014 43 Évènements – En XML  Mode déclaratif  Attribut : android:onClick  Attention : pas de check du compilateur ! <Button android:id="@+id/buttonSave" android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="buttonSave_onClick" android:text="@string/save" /> XML // event handling private void buttonSave_onClick(View v) { // do some stuff } Activity - Java Nom ce l'évènement
  • 44. session sept 2014 Yann Caron (c) 2014 44 IN01 – Séance 03 Standard views
  • 45. session sept 2014 Yann Caron (c) 2014 45 Les composants graphiques  Ce sont les composants graphiques que voit l'utilisateur, avec lesquels il agit sur (contrôle) l'interface graphique ➔ Appelés dans certains domaines, les contrôles ➔ En Android ce sont (par exemple) :  les zones de texte non éditables (~Label AWT) ou éditables (~TextComponent AWT) : TextView ➔ Les boutons (~ Button AWT) : Button les zones de texte éditables (~ TextField et TextArea de AWT) : EditText  les cases à cocher (~ Checkbox AWT) : CheckBox et les boutons radio RadioButton à regrouper dans un ensemble  Toutes ces classes sont dans le package Android.widget et dérivent de android.view.View Slide original (c) JMF
  • 46. session sept 2014 Yann Caron (c) 2014 46 Relation d'héritage Object View ViewGroupImageView LinearLayout TextView Button 1 0..* EditText ScrollView FrameLayoutImageButton CompondButton RadioButton CheckBox Slide original (c) JMF
  • 47. session sept 2014 Yann Caron (c) 2014 47 Vue d'ensemble
  • 48. session sept 2014 Yann Caron (c) 2014 48 TextView  Sert de zone de texte non éditable (~ Label AWT)  Propriétés importantes : ➔ android:text : le texte du TextView ➔ android:typeface : le type de police utilisée (monospace...) ➔ android:textStyle : le style (italic pour l'italique, bold_italic pour gras et italique...) ➔ android:textColor pour la couleur d'affichage du texte. Les valeurs sont en hexadécimale en unités RGB (par exemple #FF0000 pour le rouge)
  • 49. session sept 2014 Yann Caron (c) 2014 49 EditText  Sert de zone de texte éditable (~ TextField AWT)  Propriétés importantes : ➔ android:text : idem TextView ➔ android:inputType : spécifie le type d'entrée attendu (numberDecimal, numberSigned, phone, date, textEmailAddress, textMultiLine, textPersonName) ➔ android:hint : texte à afficher lorsque le composant est vide
  • 50. session sept 2014 Yann Caron (c) 2014 50 AutoCompleteTextView  Entre la saisie de texte et la dropdown  Propriétés importantes : ➔ android:completionThreshold : nombre de caractères avant le déclenchement de la dropdown  Méthodes importantes : ➔ setAdapter() : charge la liste des données utilisées pour l'autocomplétion. La liste doit être filtrable.  Objet important : ➔ ArrayAdapter : permet d'adapter un tableau d'objets (String en général, ou toString())
  • 51. session sept 2014 Yann Caron (c) 2014 51 AutoCompleteTextView - Exemple textName = new AutoCompleteTextView(this); textName.setAdapter( new ArrayAdapter<String>( this, android.R.layout.simple_dropdown_item_1line, new String[] {"Brochet", "Perche", "Truite"})); content.addView(textName); Context Composant utilisé pour afficher le text Liste de la dropdown  Remarque : l'IDE d'Algoid est entièrement basé sur un MultiAutoCompleteTextView. Ce dernier propose une drop down pour chaque mot du texte (spécifier un séparateur, comme l'espace pour du code source)
  • 52. session sept 2014 Yann Caron (c) 2014 52 Spinner  Une combobox sans saisie (~ CheckBox AWT)  Propriétés importantes : ➔ android:prompt : indicateur textuel lorsque la liste s'affiche ➔ android:entries : spécifie les éléments de la liste (doit faire référence à un tableau) <string-array name="my_array"> <item>first element</item> <item>second element</item> </string-array>
  • 53. session sept 2014 Yann Caron (c) 2014 53 Spinner  Comme l'AutoCompleteTextView il peut utiliser un adapter  Méthodes importantes : ➔ setAdapter : charge la liste des données Spinner spinner = (Spinner)rootView.findViewById(R.id.autoCompleteTextView1); spinner.setAdapter( new ArrayAdapter<String>(rootView.getContext(), android.R.layout.simple_dropdown_item_1line, new String[]{"Ablette", "Brochet", "Féra", "Gardon", "Omble chevalier"}));
  • 54. session sept 2014 Yann Caron (c) 2014 54 Button  Un bouton (~ Button AWT)  Propriétés importantes : ➔ android:text : idem TextView ➔ android:onClick : abonne un listener sur un évènement clic de l'utilisateur ➔ android:drawableLeft : une image à afficher avec les textes à la position souhaitée (Top, Bottom, Left, Right) ➔ android:enable : actif ou inactif
  • 55. session sept 2014 Yann Caron (c) 2014 55 CheckBox  Une case à cocher (~ CheckBox AWT)  Propriétés importantes : ➔ android:text : idem TextView ➔ android:checked : spécifie si le composant est coché par défaut
  • 56. session sept 2014 Yann Caron (c) 2014 56 RadioGroup et RadioButton  Un groupe de boutons dépendants (~ CheckBox & CheckboxGroup AWT) <RadioGroup android:id="@+id/radioGroup1"> <RadioButton android:id="@+id/radio0" android:checked="true" android:text="@string/radio1" /> <RadioButton android:id="@+id/radio1" android:text="@string/radio2" /> <RadioButton android:id="@+id/radio2" android:text="@string/radio3" /> </RadioGroup>  Pour que les RadioButton soient dépendants, il faut qu'ils soient contenus dans le même groupe
  • 57. session sept 2014 Yann Caron (c) 2014 57 RadioButton et évènements  Deux options : ➔ Créer un listener par RadioButton ➔ Utiliser la même méthode pour tous les RadioButton d'un même RadioGroup. Dans la méthode on sait quel RadioButton appelle grâce à l'attribut View
  • 58. session sept 2014 Yann Caron (c) 2014 58 RadioButton et évènements <RadioGroup android:id="@+id/radioGroup1"> <RadioButton android:id="@+id/radio0" android:checked="true" android:onClick="radio_onClick" /> <RadioButton android:id="@+id/radio1" android:onClick="radio_onClick" /> <RadioButton android:id="@+id/radio2" android:onClick="radio_onClick" /> </RadioGroup> XML OnClickListener listener = new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub } }; RadioGroup rg1 = (RadioGroup) findViewById(R.id.radioGroup1); for (int i = 0; i < rg1.getChildCount(); i++) { RadioButton r = (RadioButton) eg1.getChildAt(i); r.setOnClickListener(listener); } Activity - Java
  • 59. session sept 2014 Yann Caron (c) 2014 59 RadioButton et évènements  On teste quel bouton radio est à l'origine de l'évènement private void radio_onClick(View v) { RadioButton radio = (RadioButton)view; Log.i(this.getClass().getName(), radio.getId()+" is clicked"); switch (radio.getId()) { case R.id.radio1: break; case R.id.radio2: break; default: } } Quel radio ? Cast la vue
  • 60. session sept 2014 Yann Caron (c) 2014 60 ImageView  Affiche une image sans interaction (cf. ImageButton)  Propriétés importantes : ➔ android:src : l'id du drawable ➔ android:scaleType : contrôle comment l'image va être modifiée en fonction de la taille de la vue
  • 61. session sept 2014 Yann Caron (c) 2014 61 ImageView - ScaleType  matrix : en haut à gauche, coupe si nécessaire  fitXY : étire/compresse l'image en X et Y  fitStart, fitCenter, fitEnd : réduit/agrandit en conservant les proportions  center : conserve la taille, coupée si nécessaire et centre  centerCrop : étire/compresse l'image. Coupe l'image si la proportion n'est pas respectée  centerInside : centre et réduit si nécessaire (n'agrandit pas <> fitCenter)
  • 62. session sept 2014 Yann Caron (c) 2014 62 IN01 – Séance 03 Layouts
  • 63. session sept 2014 Yann Caron (c) 2014 63 Définition  Des conteneurs capables de placer les composants qu'ils contiennent de façon automatique  Plusieurs conteneurs == plusieurs comportements différents == plusieurs façons de placer les composants sur la vue.
  • 64. session sept 2014 Yann Caron (c) 2014 64 Relation d'héritage Object View ViewGroup LinearLayout 1 0..* ScrollView FrameLayout GridView TableLayout RelativeLayoutAbsoluteLayout
  • 65. session sept 2014 Yann Caron (c) 2014 65 Vue d'ensemble  AbsoluteLayout : position absolue (x et y)  LinearLayout : les composants, les uns au-dessus des autres (ou à côté, selon l'orientation)  RelativeLayout : la position des composants est relative aux autres  TableLayout : crée un tableau à deux dimensions organisé par colonne et par rangée  GridLayout : grille flexible, liste d'éléments continus (de gauche à droite)  FrameLayout : comme des “calques”, les composants les uns derrière les autres
  • 66. session sept 2014 Yann Caron (c) 2014 66 AbsoluteLayout  Placement des composants par positionnement  Propriétés des composants : ➔ android:layout_x et android.layout_y
  • 67. session sept 2014 Yann Caron (c) 2014 67 LinearLayout  Position en colonnes ou en lignes  Deux orientations possibles grâce à la propriété android:layout_orientation ➔ vertical : positionne les vues les unes au-dessus des autres ➔ horizontal : positionne les vues les unes à côté des autres
  • 68. session sept 2014 Yann Caron (c) 2014 68 LinearLayout - Remplissage  Propriétés Android : ➔ android:layout_width : comportement en largeur du composant ➔ android:layout_height : comportement en hauteur  Valeurs de remplissage (type de comportement) : ➔ match_parent : remplit l'emplacement que lui autorise le conteneur ➔ wrap_content : si possible, force le parent à respecter la taille du contenu du composant
  • 69. session sept 2014 Yann Caron (c) 2014 69 LinearLayout - Poids et Gravity  Poids : ➔ android:layout_weight : détermine le poids du composant par rapport aux autres ➔ Plus le poids est important, plus le composant prend de la place  Gravity : ➔ Gestion de l'espace vide : gère l'emplacement du composant dans la case ➔ Propriété Android : android:layout_gravity
  • 70. session sept 2014 Yann Caron (c) 2014 70 RelativeLayout  Positionne de façon relative  Relatif au composant : ➔ android:layout_below : en dessous de ➔ android:layout_above : au-dessus de  Position des bords : ➔ layout_toLeftOf,  layout_toRightOf,  layout_toTopOf,  layout_toBottomOf
  • 71. session sept 2014 Yann Caron (c) 2014 71 RelativeLayout  Espacement avec les composants relatifs : ➔ layout_marginTop, layout_marginLeft,  layout_marginBottom,  layout_marginRight  Occupation de la case : ➔ layout_width et layout_height
  • 72. session sept 2014 Yann Caron (c) 2014 72 <Button android:id="@+id/btn4" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@id/btn3" android:layout_toLeftOf="@id/btn3"/> <Button android:id="@+id/btn5" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@id/btn4" android:layout_toLeftOf="@+id/btn4"/> </RelativeLayout> RelativeLayout - Exemple <RelativeLayout> <Button android:id="@+id/btn1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_alignParentTop="true" android:layout_marginLeft="30dp" android:layout_marginTop="23dp"/> <Button android:id="@+id/btn2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@id/btn1" android:layout_toRightOf="@id/btn1"/> <Button android:id="@+id/btn3" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@id/btn2" android:layout_toRightOf="@id/btn2"/> Relatif à et aligné sur Inutile de créer un nouvel ID marges
  • 73. session sept 2014 Yann Caron (c) 2014 73 TableLayout  Un tableau comme en HTML  Construction par colonnes et rangées <TableLayout> <TableRow></TableRow> <TableRow></TableRow> <TableRow></TableRow> </TableLayout>
  • 74. session sept 2014 Yann Caron (c) 2014 74 TableLayout  Propriétés du tag <TableLayout> : ➔ android:shrinkColumns : colonne qui sera réduite si l'espace devient trop petit ➔ android:stretchColumns : colonne qui sera augmentée  Propriétés du tag <TableRow> : ➔ android:paddingTop : espacement haut interne  Propriétés des composants enfants : ➔ android:layout_span : occupation du composant sur plusieurs colonnes
  • 75. session sept 2014 Yann Caron (c) 2014 75 TableLayout - Exemple <TableLayout android:shrinkColumns="2" android:stretchColumns="2"> <TableRow android:id="@+id/tableRow1" android:paddingTop="50dp" > <TextView android:id="@+id/textView1" /> <TextView android:id="@+id/textView2" /> <TextView android:id="@+id/textView3" /> </TableRow> <TableRow android:id="@+id/tableRow2" > <Button android:id="@+id/button1" /> <Button android:id="@+id/button2" android:layout_span="2" /> </TableRow> </TableLayout> Occupation Adaptation selon la taille Rangée Marge intérieure
  • 76. session sept 2014 Yann Caron (c) 2014 76 GridLayout  Remplit la grille de gauche à droite ou de haut en bas  Deux orientations possibles : horizontal et vertical  Propriétés importantes : ➔ android:columnCount : nombre de colonnes avant retour à la ligne ➔ android:rowCount : nombre de rangées avant retour au début ➔ android:layout_columnSpan et android:layout_rowSpan pour gérer l'occupation
  • 77. session sept 2014 Yann Caron (c) 2014 77 FrameLayout  Permet de placer des composants en surimpression  Des panneaux glissants  Des menus  Plus de détails au cours 05  Ou à l'adresse : http://blog.neteril.org/blog/2013/10 /10/framelayout-your-best-ui-friend/
  • 78. session sept 2014 Yann Caron (c) 2014 78 Conclusion  Framework très bien conçu !  Plus simple et plus intuitif que Swing  FrameLayout offre de grandes possibilités  Ne pas hésiter à imbriquer les layouts entre eux (le composite est notre ami !)  Approches complémentaires : par WYSIWYG et en XML
  • 79. session sept 2014 Yann Caron (c) 2014 79 IN01 – Séance 03 Menus
  • 80. session sept 2014 Yann Caron (c) 2014 80 Menus  Trois types de menus ➔ Option menu : menu standard pour naviguer dans l'application ➔ Popup menu : les actions secondaires (après l'option menu en général) ➔ Menu contextuel : en fonction du contenu touché
  • 81. session sept 2014 Yann Caron (c) 2014 81 Menus  Accessibles depuis le bouton Menu de l'appareil  Les menus sont placés différemment selon la version d'Android : ➔ En bas jusqu'à Android 3.2.2 (API <= 13) ➔ En haut à droite à partir d'Android 4.0.1 (API >= 14)
  • 82. session sept 2014 Yann Caron (c) 2014 82 Déclaration en XML  Il faut créer un fichier res/menu/my_menu.xml <menu xmlns:android="http://schemas.android.com/apk/res/android" > <item android:id="@+id/menu_file" android:showAsAction="ifRoom|withText" android:title="@string/file"> <menu> <item android:id="@+id/menu_new" android:title="@string/newf"/> <item android:id="@+id/menu_open" android:title="@string/openfile"/> </menu> </item> <item android:id="@+id/menu_settings" android:title="@string/settings"/> </menu> Visible dans la barre d'action Sous-menu
  • 83. session sept 2014 Yann Caron (c) 2014 83 Dans l'activity  Les menus peuvent être différents selon les activities  On utilise la méthode onCreateOptionMenu et l'objet MenuInflater  Les inflaters sont des objets qui créent des vues à partir de fichiers XML public class MainActivity extends Activity { @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.main, menu); return true; } } Le lien vers le fichier XMLLe menu est chargé
  • 84. session sept 2014 Yann Caron (c) 2014 84 Évènement  Trois façons d'y parvenir : ➔ Redéfinir Activity.onOptionsItemSelected  (MenuItem item)  Il faudra comparer les id avec un switch sur la méthode item.getItemId() ➔ Dans onCreateOptionsMenu, pour chaque menuItem, ajouter un évènement onMenuItemClickListener ➔ Dans le XML, ajouter la méthode onClick. Attention à la signature de la méthode, elle prend comme paramètre un MenuItem et non une View
  • 85. session sept 2014 Yann Caron (c) 2014 85 onOptionItemSelected @Override public boolean onOptionsItemSelected(MenuItem item) { int id = item.getItemId(); switch (id) { case (R.id.action_example): // menu example return true; case (R.id.action_settings): // mennu settings return true; default: return super.onOptionsItemSelected(item); } } Cascade l'appel avec la super class Le menu est chargé
  • 86. session sept 2014 Yann Caron (c) 2014 86 onOptionItemSelected @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.main, menu); MenuItem item1 = menu.findItem(R.id.action_example); item1.setOnMenuItemClickListener(new OnMenuItemClickListener() { @Override public boolean onMenuItemClick(MenuItem item) { // menu example return true; } }); MenuItem item2 = menu.findItem(R.id.action_settings); item2.setOnMenuItemClickListener(new OnMenuItemClickListener() { @Override public boolean onMenuItemClick(MenuItem item) { // menu settings return true; } }); return true; } Un évènement pour chaque MenuItem
  • 87. session sept 2014 Yann Caron (c) 2014 87 ActionBar  Depuis la version 11 de l'API (Android 3.0 HoneyComb) il est possible de sortir certains MenuItems pour un accès direct dans la barre d'action. Il faut utiliser le paramètre android:showAsAction
  • 88. session sept 2014 Yann Caron (c) 2014 88 Onglets  API >= 11 ou appCompatv7  On peut créer une navigation avec des onglets (NAVIGATION_M ODE_TABS) @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.bait); ActionBar actionBar = getActionBar(); actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); ActionBar.Tab tab1 = actionBar.newTab(); tab1.setText("Fishes"); tab1.setTabListener(new TabListener() { @Override public void onTabUnselected(Tab tab, FragmentTransaction ft) { // Do some stuff } @Override public void onTabSelected(Tab tab, FragmentTransaction ft) { // Do some stuff } @Override public void onTabReselected(Tab tab, FragmentTransaction ft) { // Do some stuff } }); actionBar.addTab(tab1); // etc. } Callback obligatoire
  • 89. session sept 2014 Yann Caron (c) 2014 89 PopupMenu  API >= 11 ou appCompatv7 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.bait); final Button bt = (Button)findViewById(R.id.buttonMenu); bt.setText("Popup Menu ...."); bt.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { PopupMenu menu = new PopupMenu(MainActivity2.this, bt); MenuInflater inflater = menu.getMenuInflater(); inflater.inflate(R.menu.main, menu.getMenu()); menu.show(); } }); } Création du menu popup
  • 90. session sept 2014 Yann Caron (c) 2014 90 MenuContextuel callback = new Callback() { @Override public boolean onCreateActionMode(ActionMode mode, Menu menu) { // création MenuInflater inflater = MainActivity2.this.getMenuInflater(); inflater.inflate(R.menu.main, menu);; return true; } @Override public boolean onPrepareActionMode(ActionMode mode, Menu menu) { // appelé juste avant la création du menu return false; } @Override public boolean onActionItemClicked(ActionMode mode, MenuItem item) { // Récupérer les évènements return false; } @Override public void onDestroyActionMode(ActionMode mode) { // appelé à la destruction de celui-ci } }; TextView bait = (TextView)findViewById(R.id.textBait); bait.setOnLongClickListener(new OnLongClickListener() { @Override public boolean onLongClick(View v) { actionMode = MainActivity2.this.startActionMode(callback); return true; } }); Création du menu Démarre le menu Évènements clic
  • 91. session sept 2014 Yann Caron (c) 2014 91 IN01 – Séance 03 Intents et chaînage des activities
  • 92. session sept 2014 Yann Caron (c) 2014 92 Intent  Une intent (intention) est une description abstraite d'une action à effectuer par l'appareil  Message asynchrone interprocessus  Interagir avec des composants internes et externes à l'application  Classe abstraite : android.content.Intent
  • 93. session sept 2014 Yann Caron (c) 2014 93 Chaînage des écrans  Pour passer d'un écran à un autre, on utilise une intention :  On n'oublie pas de déclarer la nouvelle activity dans le manifest Intent intent = new Intent(this, MainActivity2.class); startActivity(intent); <activity android:name="fr.cnam.pecheurduleman.MainActivity2" android:label="@string/global_app_name"> </activity>
  • 94. session sept 2014 Yann Caron (c) 2014 94 Passage de données entre activities  Les intents permettent de passer des informations grâce à la méthode putExtra()  Que l'on récupère dans la nouvelle activity : Intent i = new Intent(this, MainActivity2.class); i.putExtra("myExtra1", "myStringValue"); i.putExtra("myExtra2", 10); startActivity(i); String myExtra1 = getIntent().getExtras().getString("myExtra1", "default"); int myExtra2 = getIntent().getExtras().getInt("myExtra2", 0); Valeur par défaut
  • 95. session sept 2014 Yann Caron (c) 2014 95 IN01 – Séance 03 Toast
  • 96. session sept 2014 Yann Caron (c) 2014 96 Toast  Une fenêtre de dialogue qui affiche un message pendant 2 (Toast.LENGTH_SHORT) ou 5 (Toast.LENGTH_LONG) secondes est un composant graphique Android : le Toast  Attention construire le Toast ne l'affiche pas : il faut utiliser show() pour cela Slide original (c) JMF Toast leToast = Toast.makeText(this, "texteAAfficher", Toast.LENGTH_LONG); leToast.show();
  • 97. session sept 2014 Yann Caron (c) 2014 97 Fin  Merci de votre attention  Des questions ?