Según la documentación, android:weightSum
define la suma máxima de peso y se calcula como la suma layout_weight
de todos los elementos secundarios si no se especifica explícitamente.
Consideremos un ejemplo con a LinearLayout
con orientación horizontal y 3 ImageViews
dentro de él. Ahora queremos que estos ImageViews
siempre tomen el mismo espacio. Para lograr esto, puede establecer el valor layout_weight
de cada uno ImageView
en 1 y weightSum
se calculará igual a 3 como se muestra en el comentario.
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
<!-- android:weightSum="3" -->
android:orientation="horizontal"
android:layout_gravity="center">
<ImageView
android:layout_height="wrap_content"
android:layout_weight="1"
android:layout_width="0dp"/>
.....
weightSum
es útil para que el diseño se represente correctamente para cualquier dispositivo, lo que no sucederá si establece el ancho y la altura directamente.
weightSum
. El comportamiento en su ejemplo sería idéntico alweightSum
omitido, y de hecho weightSum no debería especificarse en ese escenario. La documentación diceweightSum Defines the maximum weight sum. If unspecified, the sum is computed by adding the layout_weight of all of the children.
Agregando a la respuesta de superM y Jeff,
Si hay 2 vistas en LinearLayout, la primera con un layout_weight de 1, la segunda con un layout_weight de 2 y sin weightSum, de forma predeterminada, el weightSum se calcula en 3 (suma de los pesos de los hijos) y la primera vista ocupa 1/3 del espacio, mientras que la segunda ocupa 2/3.
Sin embargo, si tuviéramos que especificar el weightSum como 5, el primero tomaría 1/5 del espacio mientras que el segundo tomaría 2/5. Por lo tanto, un total de 3/5 del espacio estaría ocupado por el diseño manteniendo el resto vacío.
fuente
La suma de peso funciona exactamente como lo desea (como otras respuestas, no tiene que sumar todos los pesos en el diseño principal). En la vista secundaria, especifique el peso que desea que tome. No olvides especificar
El siguiente es un ejemplo
Esto se verá como
fuente
La documentación lo dice mejor e incluye un ejemplo (destacando el mío).
Entonces, para corregir el ejemplo de superM, suponga que tiene una
LinearLayout
orientación horizontal que contiene dosImageViews
y unaTextView
con. DefinaTextView
que tiene un tamaño fijo y desea que los dosImageViews
ocupen el espacio restante por igual.Para lograr esto, aplicaría
layout_weight
1 a cada unoImageView
, ninguno en elTextView
, y unweightSum
2.0 en elLinearLayout
.fuente
Después de experimentar un poco, creo que el algoritmo para LinearLayout es este:
Suponga que
weightSum
se establece en un valor. El caso de ausencia se discute más adelante.Primero, divida el
weightSum
por el número de elementos conmatch_parent
ofill_parent
en la dimensión de LinearLayout (por ejemplo,layout_width
fororientation="horizontal"
). Llamaremos a este valor el multiplicador de peso para cada elemento. El valor predeterminado paraweightSum
es 1.0, entonces el multiplicador de peso predeterminado es1/n
, donden
es el número defill_parent
elementos;wrap_content
elementos no contribuyen an
.Por ejemplo, cuando
weightSum
es 60 y hay 3fill_parent
elementos, el multiplicador de peso es 20. El multiplicador de peso es el valor predeterminado para, por ejemplo,layout_width
si el atributo está ausente.En segundo lugar, se calcula la máxima expansión posible de cada elemento. Primero, los
wrap_content
elementos se calculan de acuerdo con sus contenidos. Su expansión se deduce de la expansión del contenedor principal. Llamaremos al remanenteexpansion_remainer
. Este resto se distribuye entre losfill_parent
elementos según sulayout_weight
.Tercero, la expansión de cada
fill_parent
elemento se calcula como:Ejemplo:
Si
weightSum
es 60, y hay 3fill_parent
elementos con los pesos 10, 20 y 30, su expansión en la pantalla es 2/3, 1/3 y 0/3 del contenedor principal.La expansión mínima está limitada a 0. La expansión máxima está limitada al tamaño principal, es decir, los pesos están limitados a 0.
Si un elemento se establece en
wrap_content
, su expansión se calcula primero, y la expansión restante está sujeta a distribución entre losfill_parent
elementos. SiweightSum
se establece, esto lleva alayout_weight
no tener efecto sobre loswrap_content
elementos Sin embargo, loswrap_content
elementos aún pueden ser empujados fuera del área visible por elementos cuyo peso es menor que (por ejemplo, entre 0-1 paraweightSum
= 1 o entre 0-20 para el ejemplo anterior).Si no
weightSum
se especifica, se calcula como la suma de todos loslayout_weight
valores, incluidos los elementos conwrap_content
set! Por lo tanto, haberlayout_weight
establecidowrap_content
elementos puede influir en su expansión. Por ejemplo, un peso negativo reducirá los otrosfill_parent
elementos. Antes de presentar losfill_parent
elementos, la fórmula anterior se aplicará a loswrap_content
elementos, siendo la expansión máxima posible su expansión de acuerdo con el contenido envuelto. Loswrap_content
elementos se reducirán, y luegofill_parent
se calculará y distribuirá la máxima expansión posible para los elementos restantes .Esto puede conducir a resultados poco intuitivos.
fuente
Si no se especifica, la suma se calcula sumando el layout_weight de todos los elementos secundarios. Esto se puede usar, por ejemplo, para dar a un solo hijo el 50% del espacio total disponible al asignarle un layout_weight de 0.5 y establecer el weightSum en 1.0. Debe ser un valor de coma flotante, como "1.2"
fuente
Una cosa que parece que nadie más mencionó: digamos que tiene una vertical
LinearLayout
, por lo que para que los pesos en diseño / elemento / vista funcionen al 100% correctamente, todos deben tenerlayout_height
propiedades (que deben existir en su xml archivo) establecido en0dp
. Parece que cualquier otro valor arruinaría las cosas en algunos casos.fuente
Layout Weight funciona como una relación. Por ejemplo, si hay un diseño vertical y hay dos elementos (como botones o vistas de texto), uno con un peso de diseño 2 y el otro con un peso de diseño 3, respectivamente. Luego, el primer elemento ocupará 2 de 5 porciones de la pantalla / diseño y el otro 3 de 5 porciones. Aquí 5 es la suma de peso. es decir, la suma de peso divide todo el diseño en porciones definidas. Y el Peso de diseño define la cantidad de porción que ocupa un artículo en particular de la Suma de peso total predefinida. La suma de peso también se puede declarar manualmente. Los botones, las vistas de texto, los textos de edición, etc., todos se organizan utilizando la suma de peso y el peso del diseño cuando se utilizan diseños lineales para el diseño de la interfaz de usuario.
fuente
De la documentación del desarrollador
Esto se puede usar, por ejemplo, para dar a un solo hijo
50%
del espacio total disponible dándole un layout_weight de0.5
y estableciendo el weightSum en1.0
.Además de la respuesta @Shubhayu
El resto
3/5
se puede utilizar para otros diseños secundarios que realmente no necesitan ninguna parte específica del diseño que contiene.Este es el uso potencial de la
android:weightSum
propiedad.fuente