Pregunta ¿Qué significa android: layout_weight?


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


590
2017-10-22 10:10


origen


Respuestas:


Con layout_weight puede especificar una relación de tamaño entre múltiples vistas. P.ej. usted tiene un MapView y un table que debería mostrar cierta 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ás layout_weight del map a 3 y el layout_weight del table a 1.

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


794
2017-10-22 10:55



En una palabra, 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) / (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)

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 mínimo espacio requerido para procesar. 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, luego un tercio del espacio restante se le dará al primero, y dos tercios al segundo (porque reclamamos que 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


226
2017-10-22 10:46



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


64
2017-08-15 07:52



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

Aquí hay una imagen para aclarar las cosas.

enter image description here

Teoría

El término peso de diseño está relacionado con el concepto de peso promedio 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. los Views en una horizontal LinearLayout cada uno puede tomar un cierto porcentaje del ancho total. (O un porcentaje de la altura para una vertical LinearLayout.)

El diseño

los 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 el LinearLayout. Si utiliza 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 SO respuestas que tratan con este problema).

Las vistas

Cada vista en una 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 debe usar layout_width="0dp" Juntos con layout_weight="1". Olvidar esto causa muchos problemas nuevos para los usuarios. (Ver Este artículo para obtener resultados diferentes puede obtener al no establecer el ancho en 0.) Si sus puntos de vista están en una vertical  LinearLayout entonces usarías layout_height="0dp", por supuesto.

En el Button ejemplo anterior, establecí 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 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>

31
2018-04-18 06:29



layout_weight le dice a Android cómo distribuir su Views en una LinearLayout. Android primero calcula la proporción total requerida para todos Views que 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 el TextViews tiene un layout_weight de 0 (este es el valor predeterminado) y el EditTexts tiene un layout_weight de 2 cada uno, mientras Button tiene un peso de 1. Así que 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 para 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:
landscape orientation y
portrait orientation


29
2018-02-23 15:42



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,


15
2017-11-04 16:55



una de las mejores explicaciones para mí fue este (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 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 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).


9
2017-07-19 19:16



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.


5
2017-10-22 10:42



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

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

2
2018-02-27 22:03



Combinando ambas respuestas de

Flo & rptwsthi y roetzi,

Recuerda cambiar tu layout_width=0dp/pxDe lo contrario, layout_weight el comportamiento actuará en sentido inverso con el mayor número ocupado en el espacio más pequeño y el número más bajo ocupando el espacio 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


0
2017-10-02 06:34



Para adicional:

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

android:layout_height="0dp"

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

android:layout_width="0dp"

0
2018-06-24 09:45