139 votes

Est-ce une mauvaise pratique d'utiliser des marges négatives dans Android ?

Démonstration de la marge négative :

                         enter image description here

Le scénario

Chevauchement de vues en définissant une marge négative à l'une d'entre elles de manière à ce qu'elle envahisse la boîte englobante d'une autre vue.

Pensées

Cela semble fonctionner comme prévu, avec un chevauchement des mises en page si nécessaire. Mais je ne veux pas me heurter à un problème plus important en ne faisant pas les choses correctement sans le savoir. Emulateurs, périphériques physiques, etc., lorsque vous utilisez des marges négatives, tout semble fonctionner correctement, une vue envahit la boîte de délimitation d'une autre vue et, selon la façon dont elle est déclarée dans la mise en page, elle sera au-dessus ou au-dessous de l'autre vue.

Je suis également conscient que depuis l'API 21, nous pouvons définir l'option translationZ y elevation attributs pour faire apparaître la vue au-dessus ou au-dessous des autres vues mais ma préoccupation vient essentiellement du fait que dans la documentation pour le layout_margin attributs il est clairement spécifié que les valeurs de marge doivent être positives Laissez-moi vous citer :

Extrait :
Spécifie un espace supplémentaire sur les côtés gauche, supérieur, droit et inférieur de cette vue. Cet espace est en dehors des limites de cette vue. Les valeurs des marges doivent être positives . Doit être une valeur de dimension, qui est un nombre à virgule flottante auquel est ajoutée une unité telle que "14.5sp". Les unités disponibles sont : px (pixels), dp (pixels indépendants de la densité), sp (pixels mis à l'échelle en fonction de la taille de police préférée), in (pouces), mm (millimètres)...

Depuis que j'ai posé cette question, je n'ai eu aucun problème avec les marges négatives, j'ai essayé d'éviter de les utiliser autant que possible, mais j'ai pas Je n'ai rencontré aucun problème, donc même si la documentation l'indique, je ne suis pas trop inquiet à ce sujet.

2 votes

Je sais que les tests espresso ne seront pas capables de voir l'objet si l'une de ses marges est négative... c'est donc une raison pour ne pas les utiliser.

3voto

Cheung Sean Points 41

Non, vous ne devez pas utiliser negative margin . au lieu de cela, vous devez utiliser translate . Même si la marge négative fonctionne parfois, lorsque vous modifiez la mise en page de manière programmable, la traduction serait utile. Et la vue ne peut pas déborder de l'écran lorsque vous utilisez la marge.

3voto

LackeySoft Points 41

Pour moi, et en ce qui concerne la mise en place d'une marge négative sur un TextView (je réalise que l'OP fait référence à un ViewGroup, mais je cherchais des problèmes avec la mise en place de marges négatives et j'ai atterri ici)... J'ai trouvé un problème avec la version 4.0.3 (API 15) UNIQUEMENT et le paramétrage de android:layout_marginTop o android:layout_marginBottom à une valeur négative telle que -2dp.

Pour une raison quelconque, le TextView ne s'affiche pas du tout. Il semble avoir "disparu" de la vue (et pas seulement être invisible).

Lorsque j'ai essayé avec les trois autres versions de layout_margin, je n'ai pas vu le problème.

Notez que je n'ai pas essayé cela sur un appareil réel, mais sur un émulateur 4.0.3. C'est la deuxième chose étrange que je trouve qui n'affecte que la 4.0.3, donc ma nouvelle règle est de toujours test avec un émulateur 4.0.3 :)

J'ai réussi à réduire la marge inférieure d'un TextView en utilisant android:lineSpacingExtra="-2dp" qui fonctionne même si j'ai android:singleLine="true" (et je n'aurais donc pas pensé que l'interligne serait un facteur).

1 votes

J'ai trouvé un comportement similaire sur un Nexus 4 (qui est xhdpi) et 4.2.2. Il y avait une mise en page sans rembourrage, bien qu'une mise en page parente ait un rembourrage. Il y avait un TextView à l'intérieur avec un marginTop négatif. Sur la version 5.0, cela a bien fonctionné. Sous 4.2.2, à la fois sur l'appareil et dans un émulateur pour Nexus 4, il disparaît. La solution consistait à déplacer le rembourrage vers la mise en page qui contenait le TextView.

0voto

FoamyGuy Points 26600

Je ne sais que depuis peu de temps que c'est possible. Mais je n'y vois aucun problème. Il suffit de tenir compte des tailles d'écran et autres pour être sûr de ne pas faire se chevaucher accidentellement des éléments qui ne devraient pas apparaître à l'écran. (Par exemple, du texte par-dessus du texte est probablement une mauvaise idée).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X