2011-12-05 15 views
6

estoy siguiendo this tutorial para aprender acerca de los diseños lineales. Aquí está el archivo de diseño principal:¿Por qué el atributo LinearLayout "layout_weight" parece hacer lo contrario de lo que creo que debería hacer?

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

    <LinearLayout 
     android:orientation="horizontal" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:layout_weight="1"> 
     <TextView 
      android:text="red" 
      android:gravity="center_horizontal" 
      android:background="#aa0000" 
      android:layout_width="wrap_content" 
      android:layout_height="fill_parent" 
      android:layout_weight="1"/> 
     <TextView 
      android:text="green" 
      android:gravity="center_horizontal" 
      android:background="#00aa00" 
      android:layout_width="wrap_content" 
      android:layout_height="fill_parent" 
      android:layout_weight="1"/> 
     <TextView 
      android:text="blue" 
      android:gravity="center_horizontal" 
      android:background="#0000aa" 
      android:layout_width="wrap_content" 
      android:layout_height="fill_parent" 
      android:layout_weight="1"/> 
     <TextView 
      android:text="yellow" 
      android:gravity="center_horizontal" 
      android:background="#aaaa00" 
      android:layout_width="wrap_content" 
      android:layout_height="fill_parent" 
      android:layout_weight="1"/> 
    </LinearLayout> 

    <LinearLayout 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:layout_weight="1"> 
    <TextView 
     android:text="row one" 
     android:textSize="15pt" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:layout_weight="1"/> 
    <TextView 
     android:text="row two" 
     android:textSize="15pt" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:layout_weight="1"/> 
    <TextView 
     android:text="row three" 
     android:textSize="15pt" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:layout_weight="1"/> 
    <TextView 
     android:text="row four" 
     android:textSize="15pt" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:layout_weight="1"/> 
    </LinearLayout> 

</LinearLayout> 

que produce esto:

linear layout example

estaba experimentando con el intento de hacer que las barras de colores en la parte superior (el primer hijo de la disposición) verticalmente el doble de grande como las filas horizontales en la parte inferior (el último niño) por hacer el peso disposición del primer hijo el doble del segundo hijo:

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

    <LinearLayout 
     android:orientation="horizontal" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:layout_weight="2"> 
     <TextView 
      android:text="red" 
      android:gravity="center_horizontal" 
      android:background="#aa0000" 
      android:layout_width="wrap_content" 
      android:layout_height="fill_parent" 
      android:layout_weight="1"/> 
     <TextView 
      android:text="green" 
      android:gravity="center_horizontal" 
      android:background="#00aa00" 
      android:layout_width="wrap_content" 
      android:layout_height="fill_parent" 
      android:layout_weight="1"/> 
     <TextView 
      android:text="blue" 
      android:gravity="center_horizontal" 
      android:background="#0000aa" 
      android:layout_width="wrap_content" 
      android:layout_height="fill_parent" 
      android:layout_weight="1"/> 
     <TextView 
      android:text="yellow" 
      android:gravity="center_horizontal" 
      android:background="#aaaa00" 
      android:layout_width="wrap_content" 
      android:layout_height="fill_parent" 
      android:layout_weight="1"/> 
    </LinearLayout> 

    <LinearLayout 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:layout_weight="1"> 
    <TextView 
     android:text="row one" 
     android:textSize="15pt" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:layout_weight="1"/> 
    <TextView 
     android:text="row two" 
     android:textSize="15pt" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:layout_weight="1"/> 
    <TextView 
     android:text="row three" 
     android:textSize="15pt" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:layout_weight="1"/> 
    <TextView 
     android:text="row four" 
     android:textSize="15pt" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:layout_weight="1"/> 
    </LinearLayout> 

</LinearLayout> 

Pero esto hace lo contrario de mi resultado esperado: en realidad hace que las barras de colores sean verticalmente más pequeñas a la mitad.

La documentación para desarrolladores de Android especifican que

any remaining space in the view group is assigned to children in the proportion of their declared weight 

¿Por qué parece que el inverso es cierto?

+3

En realidad, es reverse.The uno que desea ser más grande se debe dar en menor número como el peso. – Hiral

+0

@ Cuidado Hiral para respaldar eso? ¿Eso es siempre cierto o solo cuando usas 'fill_parent'? Sé que es todo lo contrario, cuando des el punto de vista de la competencia cero espacio para empezar – Craigy

+0

@Craigy: en realidad no sé cuál es el comportamiento que persisten exactamente con varios cases.but casi cada vez, actúa como opuesta i described.but sí, a veces actúa de manera diferente. No conocía la razón en ese momento. Pero ahora creo que fill_parent podría estar afectando su comportamiento como dijiste. – Hiral

Respuesta

10

Énfasis en cualquier espacio restante ...

creo que es un conflicto entre el uso de fill_parent para la altura y el peso de diseño. Intente configurar android:layout_height="0dp" para ambos LinearLayout s.

5

layout_weight se usa normalmente con layout_width o layout_height establecido en wrap_content. Pruébalo, verás que luego aumenta el tamaño del diseño según la vista que tenga el mayor peso.

Ejemplo

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

    <LinearLayout 
     android:orientation="horizontal" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:layout_weight="2"> 
     <TextView 
      android:text="red" 
      android:gravity="center_horizontal" 
      android:background="#aa0000" 
      android:layout_width="wrap_content" 
      android:layout_height="fill_parent" 
      android:layout_weight="1"/> 

    </LinearLayout> 

    <LinearLayout 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:layout_weight="1"> 
    <TextView 
     android:text="row one" 
     android:textSize="15pt" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:layout_weight="1"/> 

    </LinearLayout> 

</LinearLayout> 
3
<?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="fill_parent" 
    android:orientation="vertical" android:weightSum="3"> 

    <LinearLayout 
     android:layout_width="fill_parent" 
     android:layout_height="0dp" 
     android:layout_weight="2" 
     android:orientation="horizontal" > 

     <TextView 
      android:layout_width="wrap_content" 
      android:layout_height="fill_parent" 
      android:layout_weight="1" 
      android:background="#aa0000" 
      android:gravity="center_horizontal" 
      android:text="red" /> 

     <TextView 
      android:layout_width="wrap_content" 
      android:layout_height="fill_parent" 
      android:layout_weight="1" 
      android:background="#00aa00" 
      android:gravity="center_horizontal" 
      android:text="green" /> 

     <TextView 
      android:layout_width="wrap_content" 
      android:layout_height="fill_parent" 
      android:layout_weight="1" 
      android:background="#0000aa" 
      android:gravity="center_horizontal" 
      android:text="blue" /> 

     <TextView 
      android:layout_width="wrap_content" 
      android:layout_height="fill_parent" 
      android:layout_weight="1" 
      android:background="#aaaa00" 
      android:gravity="center_horizontal" 
      android:text="yellow" /> 
    </LinearLayout> 

    <LinearLayout 
     android:layout_width="fill_parent" 
     android:layout_height="0dp" 
     android:layout_weight="1" 
     android:orientation="vertical" > 

     <TextView 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:layout_weight="1" 
      android:text="row one" 
      android:textSize="15pt" /> 

     <TextView 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:layout_weight="1" 
      android:text="row two" 
      android:textSize="15pt" /> 

     <TextView 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:layout_weight="1" 
      android:text="row three" 
      android:textSize="15pt" /> 

     <TextView 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:layout_weight="1" 
      android:text="row four" 
      android:textSize="15pt" /> 
    </LinearLayout> 

</LinearLayout> 

enter image description here

Especificar androide: weightSum para la disposición de los padres y también androide: layout_height = "0DP" para los diseños de los niños. Por favor prueba esto Espero que esto ayude.

+1

La respuesta fue útil. Pero parece que no necesitas el android: weightSum especificado. De acuerdo con la documentación de Android: "Si no se especifica, la suma se calcula agregando el layout_weight de todos los hijos". – Aishwar

Cuestiones relacionadas