Layout (ou comment positionner ces objets graphiques)
Introduction
Les objets Layout (à traduire par conteneur), vont contenir des objets graphiques (boutons, ...) mais aussi d'autres conteneurs.
Ils dérivent tous de la classe ViewGroup.
Les widgets seront donc instanciés dans un layout (cf. Instanciation des Widgets par layout XML).
Les différents layouts mis à disposition
LinearLayout: succession d'éléments qui seront positionnés
soit verticalement ou soit horizontalement (en colonne ou en ligne) (Le plus
courant)
TableLayout: tableau (colonne, ligne)
RelativeLayout: positionnement relatif à un parent ou un autre composant
FrameLayout: utilisé pour placer un seul élément dans le
coin en haut à gauche du FrameLayout
Il existe aussi
AbsoluteLayout qui permet de positionner exactement là où vous
voulez vos objets (android:layout_x et android:layout_y). Mais il est déprécié
depuis la v1.5 d'android.
Paramètres communs
Paramètres communs aux objets ViewGroup (et des aussi des views en passant !)
layout_marginTop: Pour spécifier une marge en haut de l'objet
layout_marginBottom: Même chose, mais en bas...
layout_marginLeft: à gauche...
layout_marginRight: et à droite.
layout_gravity Spécifier comment les objets
View seront positionnés. Vois chapitre sur la gravité ci-après.
layout_weight Spécifier comment l'espace doit est allouer avec les
objets View
layout_x Coordonnée X
layout_y et Y d'un ViewGroup
La couleur/l'image de fond:
android:background, une couleur de fond au format RGB (#00FF00 pour vert, par exemple).
android:background="@drawable/id_image" ou id_image est le nom de l'image à charger en background. L'image étant stockée dans drawable par défaut mais aussi dans drawable-land si vous voulez une image spécifique en mode paysage, ou les autres drawable pour d'autres formats. Cette image pourra être du jpeg, ..., du png, du 9-patch ou un shape.
La gravité
Petit retour sur layout_gravity:
Il est possible d'utiliser l'attribut de gravité sur un Layout. les conséquences seront alors d'orienter le positionnement de tous les objets contenus dans le layout (voir le paragraphe concernant la gravité).
Mais il existe l'attribut layout_gravity positionné sur un objet lui-même, qui indiquera alors "individuellement" la gravité sur cet objet.
LinearLayout
Nous en avons déjà vu un, celui le plus utilisé: LinearLayout
Souvenez-vous de notre premier programme, dans le fichier main.xml:
Ce conteneur aligne les objets les uns après les autres suivant une orientation qui sera à préciser dans l'attribut android:orientation:
- En colonne via la valeur "vertical"
- En ligne via la valeur "horizontal"
Quant aux attributs layout_width et layout_height, ils indiquent la largeur et la hauteur que va occuper un layout:
FILL_PARENT : Occupe toute la place disponible sur l'objet parent (moins le padding - la marge - paramétré sur le parent)
à remplacer
par MATCH_PARENT à partir d'android 2.3.4 (API LEVEL 8).
WRAP_CONTENT : Aussi grand que possible pour que l'objet et son contenu soient complétement visible à l'écran mais sans qu'ils n'en occupent plus qu'il n'en faut.
TableLayout
Ce layout permet de regrouper les objets de type View dans un tableau de lignes et de colonnes.
Il faudra utiliser la balise <TableRow> pour définir les lignes du tableau. Sachant qu'une ligne pourra contenir plusieurs objets View. Concernant les colonnes, chaque View représentera une cellule du tableau. La taille d'une colonne étant déterminée par la taille de la plus grande cellule dans cette colonne, cellule qui elle-même dépendra de la taille de l'objet View.
Exemple d'écriture:
RelativeLayout
Il s'agit de poser un objet par rapport à un autre.
Les attribut utilisablent sont:
- layout_alignParentTop
- layout_alignParentLeft
- layout_alignLeft
- layout_alignRight
- layout_below
- layout_centerHorizontal
Où il suffira de préciser en paramètre l'identifiant de l'objet qui servira de référence dans la position de notre objet.
Par exemple : android:layout_alignLeft="@+id/txtView1"
FrameLayout
Il s'agit de permettre de positionner des objets View à un endroit précis de l'écran via le positionnement du FrameLayout.
Si vous mettez
plusieurs View dans un FrameLayout, ils vont tous se positionner dans le coin
supérieur gauche du FrameLayout, Ils vont donc se superpositionner les
uns sur les autres.
ScrollView
Il s'agit d'un type spécial de FrameLayout. Il va permettre de faire du scrolling sur des objets occupant une place plus importante que ne le permet l'écran.
Cette objet tout
comme le FrameLayout ne devra contenir qu'un objet View ou un objet ViewGroup
qui devrait être un LinearLayout.
Et la suite ?
Concernant la surface occupée par un objet, les marges, la gravité, tout cela touche les objets eux-mêmes et non le layout.
Note
Il est tout à fait possible de positionner des layouts dans un layout. Cependant, le graphical layout dans Eclipse ne gère pas très bien cela. Une solution pour essayer de s'en sortir sera de dessiner votre layout à part, puis de faire un copier/coller dans le layout qui sera composé des autres layouts. Mais des interventions manuelles seront certainement nécessaire. Pas drôle en résumé et c'est bien dommage !