studio linearlayout layout_width layout_weight how horizontal ejemplo android android-layout android-widget

linearlayout - ¿Qué significa android: layout_weight?



relative layout (13)

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


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


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 manera inversa con el mayor número ocupado el espacio más pequeño y el número más bajo el mayor espacio.

Además, algunas combinaciones de pesos provocarán que no se pueda mostrar algún diseño (ya que ocupó demasiado el espacio).

Cuidado con esto.


Como sugiere su nombre, el peso de la disposición especifica qué cantidad o porcentaje de espacio debe ocupar el espacio de la pantalla en un campo o widget en particular.
Si especificamos el peso en orientación horizontal, entonces debemos especificar layout_width = 0px .
De manera similar, si especificamos el peso en orientación vertical, entonces debemos especificar layout_height = 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 las vistas es cero.

Cálculo para asignar cualquier espacio restante entre hijos.

En general, la fórmula es:

espacio asignado al niño = (peso individual del niño) / (suma del peso de cada niño en Diseño lineal)

Ejemplo 1

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

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

2do 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 renderizar. Si 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á en partes iguales entre ellos (porque consideramos que son igualmente importantes).

Cálculo:

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

2do 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:

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

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

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

Artículo fuente


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

<?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>


Piénsalo así, será más sencillo.

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,


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

Aquí hay una imagen para aclarar las cosas.

Teoría

El término peso de 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 un 10%, la clase intermedia vale un 20% y la final vale un 40%. Sus puntuaciones para esas partes, cuando se ponderan juntas, le dan su calificación total.

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 usas se verá así:

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

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 (consulte here y here respuestas de SO que tratan este problema).

Las vistas

Cada vista en un LinearLayout horizontal se ve así:

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

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

En el ejemplo de Button anterior, puse el peso en 1, pero puedes usar cualquier número. Lo único que importa es el total. 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 suma 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 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>


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 ocupan solo el espacio en la pantalla que necesitan ser mostradas. Asignar un valor mayor que cero dividirá el resto 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 total 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 renderizar. Si 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á en partes iguales entre ellos (porque consideramos que son igualmente importantes). Si el primero tiene un layout_weight de 1 y el segundo tiene layout_weight de 2, entonces un tercio del espacio restante se asignará al primero y dos tercios al segundo (porque consideramos que el segundo es más importante).


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

android:layout_width="0px"

de lo contrario verá basura



layout_weight le dice a Android cómo distribuir sus View en un LinearLayout . Luego, Android primero calcula la proporción total requerida para todas las View que tienen un peso específico y coloca cada View según la fracción de pantalla que ha especificado. En el siguiente ejemplo, Android ve que los TextView s tienen un layout_weight de 0 (este es el valor predeterminado) y los EditText tienen un layout_weight de 2 cada uno, mientras que el Button tiene un peso de 1 . Entonces, Android asigna el espacio ''suficiente'' para mostrar tvUsername y tvPassword y luego divide el resto 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 :

<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:
y


Para adicional

Para vertical orientación vertical , no olvides ajustar la height a 0dp

android:layout_height="0dp"

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

android:layout_width="0dp"


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 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 la altura o el ancho (según su orientación) en 0px.