2012-03-19 14 views
5

Estoy tratando de alinear 3 botones (izquierda, centro, derecha). Sé que probablemente se puede hacer con la gravedad, pero intento comprender el concepto de layout_weight aquí. Estoy usando este código:¿Por qué los botones se extienden para cubrir todo el layout_weight asignado

<LinearLayout 
id=.. 
layout_width = "wrap_content" 
layout_height = "wrap_content" 
orientation="Horizonta" 
> 
<Button 
    id=1 
    layout_width = "wrap_content" 
    layout_height = "wrap_content" 
    layout_weight = "1" 
    text= "text" /> 

<Button 
    id=2 
    layout_width = "wrap_content" 
    layout_height = "wrap_content" 
    layout_weight = "1" 
    text= "text" /> 

<Button 
    id=3 
    layout_width = "wrap_content" 
    layout_height = "wrap_content" 
    layout_weight = "1" 
    text= "text" /> 
</LinearLayout> 

Sin embargo, estoy obteniendo la parte superior de la imagen a continuación. Cual es correcta. La pregunta es por qué se estira el botón para cubrir toda el área asignada mientras estoy usando wrap_content? ¿Cómo puedo hacer que se parezca a la imagen BOTTOM?

enter image description here

Gracias

+0

¡Gracias! ¡He estado trabajando en esto durante dos horas! –

Respuesta

5

El layout_weight se utiliza para indicar cómo el espacio libre de la pantalla debe ser repartido entre los widgets. En este caso, tenemos tres botones con el mismo diseño_peso y, por lo tanto, los botones crecerán igualmente hasta que todo el espacio libre desaparezca.

Debo intentar algo más para obtener los botones de tamaño original y la alineación que queremos (izquierda - centro - derecha). Un problema es que LinearLayout horizontal no es completamente colaborativo cuando se trata de respetar los parámetros de layout_gravity. Podremos usar los parámetros de layout_gravity que afectan a la alineación vertical, pero los horizontales son ignorados por el LinearLayout padre, suspiran por otro callejón sin salida.

Una solución es poner algo entre los botones que los empuja a un lugar correcto en la pantalla. La vista de espacio se introdujo en API 14 (Ice Cream Sandwich) y es adecuada para ser utilizada para esto.

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:orientation="horizontal" > 

    <Button 
     android:id="@+id/button1" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Button" /> 

    <Space 
     android:layout_width="0dp" 
     android:layout_height="match_parent" 
     android:layout_weight = "1" /> 

    <Button 
     android:id="@+id/button2" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Button" /> 

    <Space 
     android:layout_width="0dp" 
     android:layout_height="match_parent" 
     android:layout_weight = "1" /> 

    <Button 
     android:id="@+id/button3" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Button" /> 

</LinearLayout> 

Las vistas espaciales también pueden ser reemplazados con un par de TextViews vacías para obtener el diseño para funcionar en dispositivos que se ejecutan antes de API-niveles.

<TextView 
    android:id="@+id/textView1" 
    android:layout_width="0dp" 
    android:layout_height="wrap_content" 
    android:layout_weight="1.0" 
    android:text="" />  
+0

Respuesta perfecta. Gracias – Snake

2

Cuando se utiliza el peso, la layout_width se omite, y sólo se utiliza el algoritmo de peso y luego estirar el elemento.

1

Sus botones ocupan el espacio porque usa layout_weight="1" que indica a los botones que ocupen el espacio adicional disponible, también porque el atributo layout_weight es 1 para todos los botones ocupará el mismo espacio y tendrá el mismo tamaño. No puede obtener esa disposición inferior utilizando layout_weight, use el layout_gravity para colocarlos (aquí hay otra pregunta sobre este What does android:layout_weight mean?).

Si desea que la imagen abajo intente esto:

<LinearLayout 
id=.. 
layout_width = "wrap_content" 
layout_height = "wrap_content" 
orientation="Horizonta" 
> 
<Button 
    id=1 
    layout_width = "wrap_content" 
    layout_height = "wrap_content" 
    android:layout_gravity="left" 
    text= "text" /> 

<Button 
    id=2 
    layout_width = "wrap_content" 
    layout_height = "wrap_content" 
    android:layout_gravity="center_horizontal" 
    text= "text" /> 

<Button 
    id=3 
    layout_width = "wrap_content" 
    layout_height = "wrap_content" 
    android:layout_gravity="right" 
    text= "text" /> 
</LinearLayout> 
Cuestiones relacionadas