Positionnement et occupation des surfaces des widgets

 

Positionnement

Positionnement

Le positionnement des widgets se fait grâce aux layouts.

 

Occupation de la surface

Vous pouvez passer par le fichier .XML sous res/layout (exemple main.xml) pour définir se positionnement:

La surface que peut occuper un widget se fait à partir de deux attributs:

layout_width et layout_height, qui indiquent la largeur et la hauteur que va occuper l'objet.

 

Les valeurs par défauts possibles sont:

 

FILL_PARENT : Occupe toute la place disponible sur l'objet parent (moins le padding - la marge - paramétré sur le parent)

Image non trouvée !à remplacer par MATCH_PARENT à partir d'android 2.3.4 (API LEVEL 8).

WRAP_CONTENT : Aussi grand que possible afin de faire tenir l'objet. Par exemple, pour un textview, la taille sera équivalente à celle occupée par le texte contenu dans le textview.

 

Il est possible d'indiquer ces propres valeurs:

Vous préciserez une valeur (éventuellement avec décimale - séparateur le point et non la virgule: 25.6) suivi d'une unité de mesure.

Différentes unités de mesure sont possibles:

px (pixels),

dp (density-independent pixels),

sp (scaled pixels basé sur la taille de la fonte),

in (inches ou pouce en français),

mm (millimètre).

 

Marge

Il sera possible de préciser la marge qu'il doit y avoir entre les objets. Vous utiliserez l'attribut android:padding

Par exemple android:padding="3px" qui génèrera une marge de 3 pixels autour de l'objet. (là aussi, différentes unités sont possibles: px, dp, sp, in et mm)

Cette marge pourra se limiter à un des cotés du widget:

  • paddingTop pour le haut,
  • paddingBottom pour le bas,
  • paddingLeft pour la gauche,
  • paddingRight pour la droite.

 

Gravité

Par défaut, le contenu d'un objet ou widget se place en partant du haut à gauche de cet objet. Comme si, ce contenu était attiré par une sorte de centre de gravité.

Attribut android:gravity

Et bien, ce centre de gravité peut être changé sur chaque objet. Vous utiliserez pour cela l'attribut android:gravity

Cette attribut impacte le contenu d'un widget, non le widget lui-même.

Les valeurs permises seront les suivantes:

android:gravity="center_horizontal"
android:gravity="center_vertical"
android:gravity="top"
android:gravity="bottom"
android:gravity="left"
android:gravity="right"

Image non trouvée !Ces valeurs pouvant être combinées entre elles (le fameux "ou logique" que l'on obtient par le pipe | )

 

Par exemple, dans le magnifique programme helloworld, nous avions dans main.xml:

Ici, le TextView occupe la totalité de l'écran horizontalement. Si, pour ce TextView, vous ajoutez android:gravity="right" et surtout que votre texte (soit le contenu de TextView) n'occupe pas lui même tout l'écran horizontalement (dépendant de la résolution de votre écran donc !), alors, ce texte se trouvera aligné par rapport à la bordure de droite de l'écran.

L'attribut android:gravity="bottom" sera quant-à lui sans effet, car le texte occupe toute la hauteur du TextView (Attribut layout_height="wrap_content"), il ne peut donc pas aller plus bas !

Voici en exemple:

Ce qui donne:

Image non trouvée !

bottom ne servira donc à rien ici ! Il faudra revoir la surface de l'objet TextView pour que bottom serve enfin.

 

Image non trouvée !L'attribut android:gravity pourra s'appliquer à un layout. Dans ce cas, le contenu d'un layout étant des widgets (ou d'autres layout), ce seront eux qui subiront cette gravité.

 

L'attribut android:layout_gravity

Un layout étant un objet comme un autre, il est possible de définir l'attribut android:gravity vu précédemment.

L'effet ? le contenu du layout sera orienté suivant cette gravité. Donc tous les objets contenus dans ce layout subiront cette gravité.

Il est possible d'indiquer spécifiquement à un objet l'effet de la gravité qu'il aura sur un layout. Vous utiliserez pour cela android:layout_gravity.

Les valeurs étant les mêmes que pour android:gravity, mais se limitant au widget ayant positionné cet attribut !

Dans cet exemple, le TextView occupe une surface conforme à la taille du texte. Pour aligner notre widget à droite:

Image non trouvée !Ensuite, il n'y a plus que des essais pour comprendre un peu mieux ce qui se passe, car vous allez le voir, il y a des réactions bizarres, mais tout cela réagissant par rapport à d'autres paramètres comme le layout et de son orientation, ...

Les valeurs:top, bottom, left, right, center_vertical, fill_vertical, center_horizontal, fill_horizontal, center, fill, clip_vertical, clip_horizontal, start et end.

Le poids

Toujours avec l'application helloworld, mais en ajoutant un message supplémentaire (par exemple coucou) sur un textview pour une orientation horizontale, les deux textview occupant la place correspondant à celle du parent.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="horizontal" >
<TextView
android:id="@+id/Text1"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:text="@string/hello" />

<TextView
android:id="@+id/Text2"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:text="@string/coucou" />

</LinearLayout>

Lorsque deux objets veulent occuper la totalité de la surface, seul le premier objet sera affiché.

Pour éviter ce phénomène désagréable, il est possible de positionner un attribut poids sur les objets:

android:layout_weight="valeur" ou valeur est un nombre. Plus ce nombre sera grand plus l'espace attribué à cet objet sera réduit par rapport aux objets suivants.

Image non trouvée !Evidemment, il faudra que tous les objets concernés aient cet attribut positionné à une valeur quelconque !