¿Qué significa android: layout_weight?

No entiendo cómo usar este atributo. ¿Puede alguien decirme más al respecto?

Con layout_weight puede especificar una proporción de tamaño entre múltiples vistas. Por ejemplo, tiene un MapView y una table que debe mostrar información adicional al mapa. El mapa debe usar 3/4 de la pantalla y la tabla debe usar 1/4 de la pantalla. Luego, establecerá el layout_weight del map en 3 y el layout_weight de la table en 1.

Para que funcione, también debe establecer el alto o el ancho (según su orientación) en 0px.

En pocas palabras, layout_weight especifica la cantidad de espacio adicional en el diseño que se asignará a la Vista.

LinearLayout admite la asignación de un peso a niños individuales. Este atributo asigna un valor de “importancia” a una vista y le permite expandirse para llenar cualquier espacio restante en la vista principal. El peso predeterminado de Views es cero.

Cálculo para asignar cualquier espacio restante entre el niño

En general, la fórmula es:

espacio asignado al niño = (peso individual del niño) / (sum del peso de cada niño en el diseño lineal)

Ejemplo 1

Si hay tres cuadros de texto y dos de ellos declaran un peso de 1, mientras que el tercero no tiene peso (0), el espacio restante se asigna de la siguiente manera:

1er cuadro de texto = 1 / (1 + 1 + 0)

2º cuadro de texto = 1 / (1 + 1 + 0)

3er cuadro de texto = 0 / (1 + 1 + 0)

Ejemplo 2

Digamos que tenemos una etiqueta de texto y dos elementos de edición de texto en una fila horizontal. La etiqueta no tiene layout_weight especificado, por lo que ocupa el espacio mínimo requerido para representar. Si el layout_weight de cada uno de los dos elementos de edición de texto se establece en 1, el ancho restante en el diseño principal se dividirá equitativamente entre ellos (porque afirmamos que son igualmente importantes).

Cálculo:

1ra etiqueta = 0 / (0 + 1 + 1)

2 ° cuadro de texto = 1 / (0 + 1 + 1)

3er cuadro de texto = 1 / (0 + 1 + 1)

Si, en cambio, el primer cuadro de texto tiene un layout_weight de 1 y el segundo cuadro de texto tiene un layout_weight de 2, entonces un tercio del espacio restante se asignará al primero y dos tercios al segundo (porque reclamamos el segundo es más importante).

Cálculo:

1ra etiqueta = 0 / (0 + 1 + 2)

2º cuadro de texto = 1 / (0 + 1 + 2)

3er cuadro de texto = 2 / (0 + 1 + 2)


Artículo fuente

agregando a las otras respuestas, lo más importante para que esto funcione es establecer el ancho (o la altura) del diseño en 0px

 android:layout_width="0px" 

de lo contrario, verás basura

Si hay múltiples vistas que abarcan un LinearLayout , layout_weight les da a cada una un tamaño proporcional. Una vista con un mayor valor de layout_weight “pesa” más, por lo que obtiene un espacio más grande.

Aquí hay una imagen para aclarar las cosas.

enter image description here

Teoría

El término peso del diseño está relacionado con el concepto de promedio ponderado en matemáticas. Es como en una clase universitaria donde la tarea vale un 30%, la asistencia vale 10%, la mitad del tiempo vale 20% y la final vale 40%. Sus puntajes para esas partes, cuando se ponderan juntos, le dan su calificación total.

enter image description here

Es lo mismo para el peso del diseño. Las Views en un LinearLayout horizontal pueden ocupar un cierto porcentaje del ancho total. (O un porcentaje de la altura para un LinearLayout vertical).

El diseño

El LinearLayout que uses tendrá un aspecto similar a este:

    

Tenga en cuenta que debe usar layout_width="match_parent" para LinearLayout . Si usa wrap_content , entonces no funcionará. También tenga en cuenta que layout_weight no funciona para las vistas en RelativeLayouts (ver aquí y aquí las respuestas de SO que tratan este problema).

Las vistas

Cada vista en LinearLayout horizontal se parece a esto:

  

Tenga en cuenta que debe usar layout_width="0dp" junto con layout_weight="1" . Olvidar esto causa muchos problemas nuevos para los usuarios. (Consulte este artículo para obtener resultados diferentes al no establecer el ancho en 0.) Si sus vistas están en LinearLayout vertical, entonces usaría layout_height="0dp" , por supuesto.

En el ejemplo de Button anterior, establezco el peso en 1, pero puede usar cualquier número. Es solo el total lo que importa. Puede ver en las tres filas de botones en la primera imagen que publiqué, los números son todos diferentes, pero como las proporciones son las mismas, los anchos ponderados no cambian en cada fila. A algunas personas les gusta usar números decimales que tienen una sum de 1 para que en un diseño complejo quede claro cuál es el peso de cada parte.

Una nota final. Si tiene muchos diseños nesteds que usan layout_weight , puede ser malo para el rendimiento.

Extra

Aquí está el diseño xml para la imagen superior:

                      

layout_weight le dice a Android cómo distribuir sus View en LinearLayout . Luego, Android calcula primero la proporción total requerida para todas las View que tienen un peso especificado y coloca cada View acuerdo con la fracción de la pantalla que ha especificado que necesita. En el siguiente ejemplo, Android ve que los TextView tienen un layout_weight de 0 (este es el valor predeterminado) y EditText s tienen un layout_weight de 2 cada uno, mientras que Button tiene un peso de 1 . Así que Android asigna el espacio ‘suficiente’ para mostrar tvUsername y tvPassword y luego divide el rest del ancho de la pantalla en 5 partes iguales, dos de las cuales están asignadas a etUsername , dos a etPassword y la última parte a bLogin :

        

Parece que:
orientación horizontal y
Orientación Vertical

Piénsalo de esa manera, será más simple

Si tiene 3 botones y sus pesos son 1,3,1 en consecuencia, funcionará como tabla en HTML

Proporcione 5 porciones para esa línea: 1 porción para el botón 1, 3 porción para el botón 2 y 1 porción para el botón 1

Considerar,

Una de las mejores explicaciones para mí fue esta (del tutorial de Android, busque el paso 7) :

layout_weight se usa en LinearLayouts para asignar “importancia” a las vistas dentro del diseño. Todas las vistas tienen un layout_weight predeterminado de cero, lo que significa que solo ocupan tanto espacio en la pantalla como necesitan mostrarse. Al asignar un valor superior a cero, se dividirá el rest del espacio disponible en la Vista principal, de acuerdo con el valor del layout_weight de cada Vista y su relación con el layout_weight general especificado en el diseño actual para este y otros elementos de la Vista.

Para dar un ejemplo: digamos que tenemos una etiqueta de texto y dos elementos de edición de texto en una fila horizontal. La etiqueta no tiene layout_weight especificado, por lo que ocupa el espacio mínimo requerido para representar. Si el layout_weight de cada uno de los dos elementos de edición de texto se establece en 1, el ancho restante en el diseño principal se dividirá equitativamente entre ellos (porque afirmamos que son igualmente importantes). Si el primero tiene un layout_weight de 1 y el segundo tiene un layout_weight de 2, entonces un tercio del espacio restante se asignará al primero, y dos tercios al segundo (porque reclamamos que el segundo es más importante).

http://developer.android.com/guide/topics/ui/layout-objects.html#linearlayout

layout_weight define cuánto espacio debe obtener el control, respectivamente, para otros controles.

Mire el pesoSum de LinearLayout y el layout_weight de cada Vista. android: weightSum = “4” android: layout_weight = “2” android: layout_weight = “2” Su layout_height son ambos 0px, pero no estoy seguro de que sea relevante

      

Para adicional :

Para orientación vertical , no olvide establecer la height a 0dp

 android:layout_height="0dp" 

Para la orientación horizontal , no olvide establecer width a 0dp

 android:layout_width="0dp" 

Combinando ambas respuestas de

Flo & rptwsthi y roetzi,

Recuerde cambiar su layout_width=0dp/px , de lo contrario, el comportamiento de layout_weight actuará de forma inversa, con el mayor número ocupado en el espacio más pequeño y el número más bajo ocupado en el más grande.

Además, la combinación de algunos pesos causará que no se pueda mostrar el diseño (ya que ocupó el espacio).

Cuidado con esto

Agregar android:autoSizeTextType="uniform" cambiará el tamaño del texto automáticamente

Como su nombre lo sugiere, el peso del diseño especifica qué cantidad o porcentaje de espacio debe ocupar un campo o widget en particular en el espacio de la pantalla.
Si especificamos el peso en orientación horizontal, entonces debemos especificar layout_width = 0px .
Del mismo modo, si especificamos el peso en orientación vertical, entonces debemos especificar layout_height = 0px .