¿Qué significa Android: layout weight?


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

Author: Mat Nadrofsky, 2010-10-22

13 answers

Con layout_weight puede especificar una relación de tamaño entre varias vistas. Por ejemplo, tiene un MapView y un table que deben 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 pondrás el layout_weight del map a 3 y el layout_weight del table a 1.

Para que funcione también tiene que establecer la altura o anchura (dependiendo de su orientación) a 0px.

 801
Author: Flo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-11-05 13:54:19

En pocas palabras, layout_weight especifica cuánto espacio adicional del diseño se asignará a la vista.

LinearLayout permite asignar 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 padre. El peso predeterminado de las vistas es cero.

Cálculo para asignar cualquier espacio restante entre el hijo

En general, la fórmula es:

Espacio asignado to child = (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 el tercero no tiene peso (0), entonces el espacio restante se asigna de la siguiente manera:

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

2o 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 texto editar elementos en una fila horizontal. La etiqueta no tiene layout_weight especificado, 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 padre se dividirá por igual entre ellos (porque afirmamos que son igualmente importantes).

Cálculo:

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

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

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

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

Cálculo:

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

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

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


Artículo de origen

 230
Author: ArK,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-10-27 19:57:01

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

android:layout_width="0px"

De lo contrario verás basura

 66
Author: roetzi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-09-01 10:26:42

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

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

introduzca la descripción de la imagen aquí

Teoría

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

introduzca la descripción de la imagen aquí

Es lo mismo para el peso del diseño. El Views en un LinearLayout horizontal puede cada uno tomar un cierto porcentaje de la anchura total. (O un porcentaje de la altura para una vertical LinearLayout.)

El Diseño

El LinearLayout que uses 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 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í para las respuestas SO que tratan este tema).

Las vistas

Cada vista en horizontal LinearLayout se ve algo como esto:

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

Tenga en cuenta que necesita usar layout_width="0dp" junto con layout_weight="1". Olvidar esto causa muchos problemas a los nuevos usuarios. (Vea este artículo para obtener diferentes resultados que puede obtener al no establecer el ancho en 0.) Si sus puntos de vista son en una vertical LinearLayout entonces usarías layout_height="0dp", por supuesto.

En el ejemplo anterior de Button puse el peso en 1, pero puedes usar cualquier número. Es solo el total lo que importa. Se 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 esté claro lo que el 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>
 31
Author: Suragch,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 11:55:10

layout_weight le dice a Android cómo distribuir tus View s en un LinearLayout. Android primero calcula la proporción total requerida para todos los Viewque tienen un peso especificado y coloca cada View de acuerdo con la fracción de la pantalla que ha especificado que necesita. En el siguiente ejemplo, Android ve que los TextView s tienen un layout_weight de 0 (este es el valor predeterminado) y los EditText s tienen un layout_weight de 2 cada uno, mientras que el Button tiene un peso de 1. Así que Android asigna 'lo suficiente' espacio para mostrar tvUsername y tvPassword y luego divide el resto del ancho de la pantalla en 5 partes iguales, dos de las cuales se asignan 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:
orientación horizontal y
orientación vertical

 29
Author: Tash Pemhiwa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-11-22 14:47:33

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

Si tiene 3 botones y sus pesos son 1,3,1 en consecuencia, funcionará como una 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

Atención,

 15
Author: George Nguyen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-11-04 16:55:10

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 layout. 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. La asignación de un valor superior a cero dividirá el resto del espacio disponible en la vista padre, de acuerdo con el valor de cada vista layout_weight y su relación con el layout_weight total especificado en el layout 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 especificada, 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 padre se dividirá por igual entre ellos (porque reclamamos 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 le dará al primero, y dos tercios al segundo (porque afirmamos que el segundo es más importante).

 10
Author: Andre Steingress,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-07-19 19:16:50

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

Layout_weight define cuánto espacio debe obtener el control respectivamente con respecto a otros controles.

 6
Author: Vladimir Ivanov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-10-22 10:42:31

Por favor mira el weightSum 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 relevan

<?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>
 3
Author: Ming Leung,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-09-01 10:28:01

Para adicional

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

android:layout_height="0dp"

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

android:layout_width="0dp"
 1
Author: Alen Lee,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-06-24 09:45:50

Combinando ambas respuestas de

Flo & rptwsthi y roetzi,

Recuerde cambiar su layout_width=0dp/px, de lo contrario el comportamiento layout_weight actuará inversamente con el número más grande 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 causarán que no se pueda mostrar algún diseño (ya que sobre ocupó el espacio).

Cuidado con esto.

 0
Author: user2837483,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-10-02 07:10:50

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

 0
Author: skryshtafovych,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-08-15 17:42:53

Como su nombre indica, Layout weight especifica la cantidad o porcentaje de espacio que un campo o widget en particular debe ocupar 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.

 -1
Author: Akanksha Hegde,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-05-14 10:52:56