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)
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
http://developer.android.com/guide/topics/ui/layout-objects.html#linearlayout
layout_weight define la cantidad de espacio que el control debe obtener, respectivamente, a otros controles.
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.