Propriété de Albiri Sigue
customer 27921 at Fri Mar 11 19:19:45 +0100 2011
56 L’art du développement Android
Nous entrons d’abord dans l’élément RelativeLayout. Ici, on veut utiliser toute la largeur
de l’écran (android:layout_width = "fill_parent"), n’utiliser que la hauteur nécessaire (android:layout_height = "wrap_content"), avec un remplissage de 5 pixels
entre les limites du conteneur et son contenu (android:padding = "5px").
Puis nous définissons un label assez basique, hormis son remplissage de 15 pixels
(android:padding = "15px"), que nous expliquerons plus loin.
Nous ajoutons ensuite le champ que nous voulons placer à droite du label, avec sa ligne de
base alignée avec celle du label et nous faisons en sorte qu’il occupe le reste de cette
"ligne". Ces trois caractéristiques sont gérées par trois propriétés :
● android:layout_toRight = "@id/label" ;
● android:layout_alignBaseline = "@id/label" ;
● android:layout_width = "fill_parent".
Si nous n’avions pas utilisé le remplissage de 15 pixels pour le label, le haut du champ
serait coupé à cause du remplissage de 5 pixels du conteneur lui-même. En effet, la
propriété android: layout_alignBaseline = "@id/label" se contente d’aligner
les lignes de base du label et du champ. Par défaut, le haut du label est aligné avec le haut
de son parent, or il est plus petit que le champ puisque ce dernier est entouré d’une boîte.
Le champ dépendant de la position du label qui a déjà été définie (puisqu’il apparaît avant
lui dans le fichier XML), le champ serait trop haut et son bord supérieur serait rogné par le
remplissage du conteneur.
Vous rencontrerez probablement ce genre de problème lorsque vous voudrez mettre en
place des RelativeLayout pour qu’ils apparaissent exactement comme vous le souhaitez.
La solution à ce casse-tête consiste, comme nous l’avons vu, à ajouter 15 pixels de remplissage au-dessus du label, afin de le pousser suffisamment vers le bas pour que le champ ne
soit pas coupé.
Voici quelques "solutions" qui ne marchent pas :
● Vous ne pouvez pas utiliser android:layout_alignParentTop sur le champ car il
ne peut pas y avoir deux propriétés qui tentent en même temps de définir la position
verticale du champ. Ici, android:layout_alignParentTop entrerait en conflit avec la
propriété android:layout_alignBaseline = "@id/label", qui apparaît plus bas, et
c’est cette dernière qui l’emporterait. Vous devez donc soit aligner le haut, soit aligner
les lignes de base, mais pas les deux.
● Vous ne pouvez pas d’abord définir le champ puis placer le label à sa gauche car on ne
peut pas faire de "référence anticipée" vers un widget – il doit avoir été défini avant de
pouvoir y faire référence.
Revenons à notre exemple. Le bouton OK est placé sous le champ (android:layout_below
= "@id/entry") et son bord droit est aligné avec le bord droit du champ
Livre Android.book Page 56 Dimanche, 8. novembre 2009 12:23 12
customer 27921 at Fri Mar 11 19:19:45 +0100 2011
56 L’art du développement Android
Nous entrons d’abord dans l’élément RelativeLayout. Ici, on veut utiliser toute la largeur
de l’écran (android:layout_width = "fill_parent"), n’utiliser que la hauteur nécessaire (android:layout_height = "wrap_content"), avec un remplissage de 5 pixels
entre les limites du conteneur et son contenu (android:padding = "5px").
Puis nous définissons un label assez basique, hormis son remplissage de 15 pixels
(android:padding = "15px"), que nous expliquerons plus loin.
Nous ajoutons ensuite le champ que nous voulons placer à droite du label, avec sa ligne de
base alignée avec celle du label et nous faisons en sorte qu’il occupe le reste de cette
"ligne". Ces trois caractéristiques sont gérées par trois propriétés :
● android:layout_toRight = "@id/label" ;
● android:layout_alignBaseline = "@id/label" ;
● android:layout_width = "fill_parent".
Si nous n’avions pas utilisé le remplissage de 15 pixels pour le label, le haut du champ
serait coupé à cause du remplissage de 5 pixels du conteneur lui-même. En effet, la
propriété android: layout_alignBaseline = "@id/label" se contente d’aligner
les lignes de base du label et du champ. Par défaut, le haut du label est aligné avec le haut
de son parent, or il est plus petit que le champ puisque ce dernier est entouré d’une boîte.
Le champ dépendant de la position du label qui a déjà été définie (puisqu’il apparaît avant
lui dans le fichier XML), le champ serait trop haut et son bord supérieur serait rogné par le
remplissage du conteneur.
Vous rencontrerez probablement ce genre de problème lorsque vous voudrez mettre en
place des RelativeLayout pour qu’ils apparaissent exactement comme vous le souhaitez.
La solution à ce casse-tête consiste, comme nous l’avons vu, à ajouter 15 pixels de remplissage au-dessus du label, afin de le pousser suffisamment vers le bas pour que le champ ne
soit pas coupé.
Voici quelques "solutions" qui ne marchent pas :
● Vous ne pouvez pas utiliser android:layout_alignParentTop sur le champ car il
ne peut pas y avoir deux propriétés qui tentent en même temps de définir la position
verticale du champ. Ici, android:layout_alignParentTop entrerait en conflit avec la
propriété android:layout_alignBaseline = "@id/label", qui apparaît plus bas, et
c’est cette dernière qui l’emporterait. Vous devez donc soit aligner le haut, soit aligner
les lignes de base, mais pas les deux.
● Vous ne pouvez pas d’abord définir le champ puis placer le label à sa gauche car on ne
peut pas faire de "référence anticipée" vers un widget – il doit avoir été défini avant de
pouvoir y faire référence.
Revenons à notre exemple. Le bouton OK est placé sous le champ (android:layout_below
= "@id/entry") et son bord droit est aligné avec le bord droit du champ
Livre Android.book Page 56 Dimanche, 8. novembre 2009 12:23 12
