web-dev-qa-db-fra.com

Les marges LinearLayout, RelativeLayout, etc. ne fonctionnent pas comme prévu

Les marges dans les dispositions de groupe ne semblent pas fonctionner.

Par exemple,

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_margin="40dip"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent">

    <Button
        Android:id="@+id/button"
        Android:layout_width="match_parent"
        Android:layout_height="match_parent"
        Android:text="I'm a button" />

</LinearLayout>

devrait afficher un bouton avec des marges de 40p de tous les côtés. Cependant, il a des marges de 80p à droite et en bas.

Est-ce que je fais quelque chose de mal? Est-ce un bug?

Une solution de contournement consisterait à utiliser la gravité, mais cela ne fonctionne qu'avec des marges égales.

BTW, il y a une question similaire publiée ici mais n'a pas reçu de réponse.

23
Matt

Android:padding="40dp" sur le LinearLayout ou Android:layout_margin="40dp" sur le bouton vous donnera l'effet souhaité. Le remplissage définit l'espace entre les bords d'une vue et son contenu, la marge de mise en page définit un espace supplémentaire sur les côtés d'une vue.

25
Robby Pond

Le problème est en fait la façon dont FrameLayout interprète les marges. setContentView() attache votre mise en page "principale" à un FrameLayout, qui est la racine réelle de la hiérarchie des vues (vous pouvez le voir avec Hierarchy Viewer) et vous est proposé par téléphone.

Les marges sont gérées par la disposition parent, donc dans ce cas, c'est la principale FrameLayout. Je ne sais pas si c'est une fonctionnalité ou un bug, mais c'est ainsi que cette disposition interprète les marges.

Donc, la solution a déjà été publiée pendant que je tapais: utilisez plutôt le remplissage.

13
bigstones

si vous avez besoin de définir une marge pour une mise en page, enveloppez-la simplement avec une autre mise en page linéaire ou relative

<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
  Android:layout_width="fill_parent"
  Android:layout_height="fill_parent">

  <LinearLayout Android:layout_margin="40dip"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent">

    <Button Android:id="@+id/button"
      Android:layout_width="match_parent"
      Android:layout_height="match_parent"
      Android:text="I'm a button" />

  </LinearLayout>

</LinearLayout>
6
yorkw

Envelopper la disposition linéaire avec une autre disposition est la meilleure stratégie.

0
Pratha