Greg's Devblog Par un développeur, pour les développeurs

11nov/100

Android : remplacer AbsoluteLayout par RelativeLayout

Sur Android, Google avait prévu un AbsoluteLayout, dont le principe est relativement simple : on peut placer un View où on veut dessus, en pixels. Ce layout a cependant été déprécié pour des soucis de compatibilité des applications : si une application fait tous ses placements en pixels, le jour où on la met sur un écran de résolution différente, c'est pourri !

Sur les différents sites, quand on voit des gens demander ce qu'on peut utiliser pour remplacer l'AbsoluteLayout, pas mal de personnes crient en scandale en disant que si ce layout a été retiré c'est justement parce que placer des choses au pixel près c'est mal, et qu'il faut utiliser les autres layouts, qui eux seront bien indépendants de la résolution...

Certes, mais alors on fait quoi quand on a un vrai besoin ? Dans mon cas, on peut surligner du texte (dans une image), et j'ai besoin de pouvoir placer une icone à côté du passage surligné. Je connais les coordonnées à l'écran du surlignage, qui est fait en dur dans l'image, et je ne vois pas trop comment faire à part placer un bouton là où je le veux, au pixel près.

En fait, il existe une solution, et elle est toute simple : le RelativeLayout. J'en ai déjà parlé dans un précédent billet, le RelativeLayout est assez sympa car en fait on peut placer dedans des Views relativement à d'autres Views où aux limites du layout... En fait, par défaut un élément placé sur un RelativeLayout sera disposé relativement au coin supérieur gauche. Si on lui applique une marge, on peut donc réussir à le placer à n'importe quel endroit sur ce layout. Et voilà, en pratique le RelativeLayout peut se comportement exactement comme l'AbsoluteLayout.

Voici un bout de code non testé pour donner une idée de comment s'en servir :

int x = position X en pixels;
int y = position Y en pixels;

RelativeLayout l = new RelativeLayout(...);
RelativeLayout.LayoutParams params;

Button b = new Button(...);
params = new RelativeLayout.LayoutParams(WRAP_CONTENT, WRAP_CONTENT);
params.leftMargin = x;
params.topMargin = y;
l.addView(b, params);

Je vous laisse compléter les trous, ce n'est pas bien méchant. J'ai appliqué ça au boulot, et j'ai enfin obtenu le résultat que je voulais (j'ai placé mon RelativeLayout dans le FrameLayout qui contenait déjà les images, histoire que tout soit en superposition...)
A noter qu'il ne sert à rien de faire 1 layout par View (ici Button), on peut mettre tous ceux qu'on veut sur le même RelativeLayout.

Solution tirée de StackOverflow...

Commentaires (0) Trackbacks (0)

Aucun commentaire pour l'instant


Laisser un commentaire


Aucun trackbacks pour l'instant