¿Qué significa android: layout_weight?

No entiendo cómo usar este atributo. ¿Puede alguien decirme más sobre él?

Con layout_weight puede especificar una relación de tamaño entre varias vistas. Por ejemplo, tiene un MapView y una table que debe mostrar alguna información adicional al mapa. El mapa debe utilizar 3/4 de la pantalla y la tabla debe utilizar 1/4 de la pantalla. A continuación, establecerá el layout_weight del map en 3 y el layout_weight de la tabla en 1.

Para conseguir que funcione usted también tiene que fijar la altura o el ancho (dependiendo de su orientación) a 0px.

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

LinearLayout admite asignar un peso a los niños individuales. Este atributo asigna un valor de "importancia" a una vista y permite que se expanda para llenar cualquier espacio restante en la vista principal. El peso por defecto 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) / (suma 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)

3º 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 layout_weight especificación de layout_weight , por lo que ocupa el espacio mínimo requerido para renderizar. 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á por igual entre ellos (porque afirmamos que son igualmente importantes).

Cálculo:

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

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

3ª casilla de texto = 1 / (0 + 1 + 1)

Si, por el contrario, 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 dará al primero y dos tercios al segundo La segunda es más importante).

Cálculo:

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

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

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


Artículo de origen

Añadiendo a las respuestas anteriores, lo más importante para conseguir esto para trabajar es establecer el ancho de diseño (o altura) a 0px

 android:layout_width="0px" 

De lo contrario verá basura

layout_weight le dice a Android cómo distribuir sus View en LinearLayout . 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 el TextView tiene un layout_weight de 0 (este es el valor predeterminado) y el EditText s tiene un layout_weight de 2 cada uno, mientras que el Button tiene un peso de 1 . Así que Android asigna espacio suficiente para mostrar tvUsername y tvPassword y luego divide el resto del ancho de pantalla en 5 partes iguales, dos de las cuales están asignadas a etUsername , dos a etPassword y la última parte a bLogin :

 <LinearLayout android:orientation="horizontal" ...> <TextView android:id="@+id/tvUsername" android:text="Username" android:layout_width="wrap_content" ... /> <EditText android:id="@+id/etUsername" android:layout_width="0dp" android:layout_weight="2" ... /> <TextView android:id="@+id/tvPassword" android:text="Password" android:layout_width="wrap_content" /> <EditText android:id="@+id/etPassword" android:layout_width="0dp" android:layout_weight="2" ... /> <Button android:id="@+id/bLogin" android:layout_width="0dp" android:layout_weight="1" android:text="Login"... /> </LinearLayout> 

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

Si hay varias vistas que abarcan un LinearLayout , entonces layout_weight les da a cada uno un tamaño proporcional. Una vista con un valor de layout_weight más layout_weight "pesa" más, por lo que obtiene un espacio más grande.

Aquí hay una imagen para hacer las cosas más claras.

Introduzca aquí la descripción de la imagen

Teoría

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

Introduzca aquí la descripción de la imagen

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 se utiliza se verá algo como esto:

 <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <!-- list of subviews --> </LinearLayout> 

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

Las vistas

Cada vista en un LinearLayout horizontal se parece a esto:

 <Button android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" /> 

Tenga en cuenta que necesita utilizar layout_width="0dp" junto con layout_weight="1" . Olvidar esto provoca muchos problemas de nuevos usuarios. (Vea este artículo para los resultados diferentes que usted puede conseguir por no fijar el ancho a 0.) Si sus vistas están en un LinearLayout vertical entonces usted utilizaría el layout_height="0dp" , por supuesto.

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

Una nota final. Si tiene un montón de diseños anidados que usan layout_weight , puede ser malo para el rendimiento.

Extra

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

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="android:layout_weight=" android:textSize="24sp" /> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <Button android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:text="1" /> <Button android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="2" android:text="2" /> <Button android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:text="1" /> </LinearLayout> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="android:layout_weight=" android:textSize="24sp" /> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <Button android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="10" android:text="10" /> <Button android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="20" android:text="20" /> <Button android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="10" android:text="10" /> </LinearLayout> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="android:layout_weight=" android:textSize="24sp" /> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <Button android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight=".25" android:text=".25" /> <Button android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight=".50" android:text=".50" /> <Button android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight=".25" android:text=".25" /> </LinearLayout> </LinearLayout> 

Piensa que de esa manera, será más simple

Si tienes 3 botones y sus pesos son 1,3,1 por consiguiente, 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 (desde el tutorial de Android, busque el paso 7) :

Layout_weight se utiliza en LinearLayouts para asignar "importancia" a las vistas dentro del diseño. Todas las vistas tienen un layout_weight por defecto de cero, lo que significa que ocupan sólo la misma cantidad de espacio en la pantalla que necesitan para mostrarse. Asignar un valor mayor que cero dividirá el resto del espacio disponible en la vista primaria, de acuerdo con el valor de cada layout_weight de la vista y su relación con el layout_weight global especificado en el diseño actual para este y otros elementos de View.

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 especificación de layout_weight, por lo que ocupa el espacio mínimo requerido para renderizar. 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á por igual 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 dará al primero, y dos tercios al segundo (porque afirmamos que el segundo es más importante).

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

Layout_weight define la cantidad de espacio que el control debe obtener, respectivamente, para otros controles.

Combinando ambas respuestas de

Flo & rptwsthi y roetzi,

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

Además, algunas combinaciones de pesos causado algún diseño no se puede mostrar (ya que sobre ocuparon el espacio).

Cuidado con esto.

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent" android:weightSum="4"> <fragment android:name="com.example.SettingFragment" android:id="@+id/settingFragment" android:layout_width="match_parent" android:layout_height="0px" android:layout_weight="2" /> <Button android:id="@+id/dummy_button" android:layout_width="match_parent" android:layout_height="0px" android:layout_weight="2" android:text="DUMMY" /> </LinearLayout> 

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

  • Mostrar cuadro de diálogo casi pantalla completa en mi caso (con ActionBar y superposición)
  • Android WebView no se actualiza después de que el contenido de la webview ha sido modificado por JavaScript
  • Eliminación de la barra de notificación en una aplicación de Android
  • Vista de texto de Autocompletar de Twitter como Android
  • Cargar imágenes en ImageView en Android
  • Android obtener la posición del elemento seleccionado en gridview
  • ¿Dónde defino mi OnClickListener para cerrar una vista de diálogo personalizada en Android?
  • FindViewById (int) devuelve null para vistas personalizadas, pero no incorpora Android
  • AutoCompleteTextView muestra'android.database.sqlite.SQLiteCursor@'... después de hacer la selección
  • Android Spinner - ¿Cómo eliminar los botones de radio?
  • Cómo iniciar la actividad después de presionar el botón widget?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.