2011-03-23 14 views
20

Los márgenes en los diseños de grupo no parecen funcionar.LinearLayout, RelativeLayout, etc. los márgenes no funcionan como se esperaba

Por ejemplo,

<?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> 

debe mostrar un botón con márgenes 40p en todos los lados. Sin embargo, tiene márgenes de 80p en la parte derecha e inferior.

¿Estoy haciendo algo mal? ¿Esto es un error?

Una solución alternativa sería utilizar la gravedad, pero esto solo funciona con márgenes uniformes.

Por cierto, hay una pregunta similar posted here pero no ha sido respondida.

+0

intentar establecer el botón central horizontal – Nepster

Respuesta

20

android:padding="40dp" en el LinearLayout o android:layout_margin="40dp" en el botón le dará el efecto que desee. El relleno define el espacio entre los bordes de una vista y su contenido, el margen de diseño define espacio adicional en los lados de una vista.

+1

margen debe margen del 'LinearLayout' desde todos los lados por' 40dp'. Es extraño que no esté funcionando como se esperaba. –

11

El problema es realmente la forma en que FrameLayout interpreta los márgenes. setContentView() adjunta su diseño "principal" a FrameLayout, que es la raíz real de la jerarquía de vistas (puede verlo con el Visor de jerarquía) y se lo ofrece el teléfono.

Los márgenes se gestionan mediante el diseño principal, por lo que en este caso es el FrameLayout principal. No sé si es una característica o un error, pero así es como este diseño interpreta los márgenes.

Bueno, la solución ya estaba publicada mientras escribía: use relleno en su lugar.

+0

Recuerdo que solucioné algunos errores con la forma en que FrameLayout maneja los márgenes durante el marco de tiempo de Honeycomb e involucraba la configuración de gravedad predeterminada. De hecho, puede ser un error. :) – adamp

+0

La otra forma es establecer android: layout_gravity = "top | left" para Ver eso dentro de FrameLayout. – VinceStyling

5

si necesita ajustar el margen para una presentación, simplemente se envuelve con otra lineal o disposición relativa

<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> 
+2

Esta es la mejor respuesta. El relleno no es necesariamente lo que desea, especialmente si su diseño tiene un fondo visible. –

+0

Debe evitar los diseños de anidación solo con el fin de dar margen al interno. http://developer.android.com/training/improving-layouts/optimizing-layout.html. Esta no es la mejor respuesta de ninguna manera. –

Cuestiones relacionadas