significado - ¿Cómo funciona android: layout_weight?
tumblr wikipedia (8)
Basándose en lo que dijo Janusz, si usas fill_parent, puedes configurar android: layout_weight para "dividir" el "área completa" entre múltiples elementos de diseño.
El layout_weight no aumenta el área, sino que lo aumenta "a la derecha" al área. pero también es relativo al padre. Si tiene un padre con un layout_height = fill_parent, con un layout_weight = 0 y el padre tiene un hermano con el mismo, la configuración de layout_weight = 1 para uno de los hijos no afecta al padre.
Tanto el padre como el hermano tomarían el 50% del área disponible que pueden llenar.
Cuando tengo lo siguiente, muestra que el diseño superior con cuatro colores tiene un área mucho más pequeña que el área de diseño inferior.
De acuerdo con esta documentación , cuando agrega más a layout_weight
, debería aumentar el área, pero disminuye en el código.
<?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="4">
<TextView
android:text="red"
android:gravity="center_horizontal"
android:background="#aa0000"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:layout_weight="3"/>
<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>
En las propiedades de diseño lineal, cambie el ancho del diseño a "fill_parent"
lugar de "wrap_content"
Espero que ayude.
La solución es establecer layout_height en 0px cuando usa layout_weight.
¿Pero por qué observas esta conducta aparentemente extraña / inversa?
En breve : el espacio restante es negativo y, por lo tanto, el niño con peso 4 recibe más espacio negativo y su altura es más reducida.
Detalles :
Suponga que la altura del diseño vertical principal es de 100 píxeles.
La altura del diseño en cada niño es fill_parent
(es decir, cada niño también tiene 100 píxeles de altura)
La altura total de todos los elementos secundarios = 2 * 100 píxeles
La altura restante = 100 - (2 * 100) = -100 píxeles ( es negativo )
Ahora, distribuyamos esta altura restante entre niños. El primero recibirá la mayor parte: 80% (es decir, -100 * 4 / (4 + 1)). El segundo niño recibe el 20% (es decir, -100 * 1 / (4 + 1))
Ahora calcule la altura resultante:
niño 1: 100 + (-80) = 20px
niño 2: 100 + (-20) = 80px
Nada extraño aquí, solo las matemáticas. ¡Solo ten en cuenta que el espacio restante puede ser negativo! (o establezca la altura explícitamente en 0 como se recomienda)
Sé que es tarde pero espero que ayude a las personas:
Use android:weightSum
en el padre. Aquí hay un enlace a los documentos de desarrollo.
http://developer.android.com/reference/android/widget/LinearLayout.html#attr_android:weightSum
Use android:weightSum
of 1.0
en el padre y luego use 0.x
en las vistas secundarias con android:layout_weight
para que puedan usar esa proporción de espacio.
Si está utilizando fill_parent en LinearLayout, el diseño ocupará tanto espacio como sea posible y todos los elementos de diseño definidos más adelante tendrán que ocuparse del espacio que queda.
Si establece la altura de ambos LinearLayouts en wrap_content, el peso debería funcionar como está documentado.
Si la orientación de linearlayout es vertical, establezca layout_height como 0dp. En caso de disposición horizontal, configure layout_width como 0dp.
Si no seguimos las reglas anteriores, la vista tiende a ocupar espacio según los atributos especificados y, por lo tanto, la alineación no es la esperada.
Si obtiene el error como
error
Tamaño sospechoso: esto hará que la vista sea invisible, probablemente destinada a la disposición ...
recuerde establecer el parámetro correcto en android:orientation
en el padre
Yo tuve el mismo problema. El truco está en no usar "wrap_content" o "fill_parent" para los controles a los que le está asignando un peso. En su lugar, establezca el layout_height en 0px (cuando se encuentre dentro de un diseño vertical) y luego los controles secundarios se dosificarán según los valores de peso.