Diseño lineal y peso en Android


262

Siempre leo sobre este valor de peso divertido en las documentaciones de Android. Ahora quiero probarlo por primera vez, pero no funciona en absoluto.

Según tengo entendido por las documentaciones de este diseño:

  <LinearLayout
     android:layout_width="fill_parent"
     android:layout_height="wrap_content"
     android:orientation="horizontal">

     <Button
        android:text="Register"
        android:id="@+id/register"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:padding="10dip"
        weight="1" />

     <Button
        android:text="Not this time"
        android:id="@+id/cancel"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:padding="10dip"
        weight="1" />

  </LinearLayout>

debería crear dos botones que estén alineados horizontalmente y compartir el espacio por igual. El problema es que los dos botones no crecen para llenar el espacio.

Me gustaría que los botones crezcan y llenen toda la línea. Si ambos botones están configurados para coincidir con el padre, solo se muestra el primer botón y llena toda la línea.


actualización: el porcentaje de soporte de Android también puede hacerlo muy bien. code2concept.blogspot.in/2015/08/…
nitesh

Respuestas:


160

No está configurando la layout_weightpropiedad. Su código lee weight="1"y debería leer android:layout_weight="1".


684

3 cosas para recordar:

  • configura el android: layout_width de los hijos a "0dp"
  • configura el android: weightSum del padre ( editar: como Jason Moore notó, este atributo es opcional, porque por defecto está configurado en la suma de diseño y peso de los niños)
  • configure el android: layout_weight de cada hijo proporcionalmente (por ejemplo, weightSum = "5", tres hijos: layout_weight = "1", layout_weight = "3", layout_weight = "1")

Ejemplo:

    <LinearLayout
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:weightSum="5">

    <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="3"
        android:text="2" />

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

    </LinearLayout>

Y el resultado:

Ejemplo de peso de diseño


66
Gracias por el consejo sobre establecer el ancho a cero. También descubrí que no era necesario establecer weightSum en el padre.
Jason Moore

30
Es bueno saberlo, gracias. Si es así, establecer el weightSum puede ser útil cuando no desea que los niños llenen el 100% del padre.
Anke

13
Esto es correcto para los diseños XML estáticos. Si agrega Vistas dinámicamente en tiempo de ejecución, deberá usar addView con parámetros de diseño como addView(button, new LinearLayout.LayoutParams(0, height, 1));Esto es cierto incluso si está inflando diseños con los valores correctos de ancho y peso.
Trepatroncos

Usted dice configurar el android: weightSum del padre - configúrelo en algún valor o simplemente póngalo, ¿cómo debería establecerse?
theJerm

1
@batbrat es correcto, estaba generando IU dinámicamente. A veces trato los fragmentos XML como plantillas y luego modifico o relleno en tiempo de ejecución. Este truco no me funcionó en este caso, tuve que volver a configurar el ancho y el peso explícitos para que funcione.
Trepatroncos

52

Es android:layout_weight. El peso solo se puede usar en LinearLayout. Si la orientación de lineallayout es Vertical, entonces use android:layout_height="0dp"y si la orientación es horizontal, entonces use android:layout_width = "0dp". Funcionará perfectamente.



16

Intente configurar los layout_widthdos botones en "0dip" y los weightdos botones en0.5


Ahora ambos botones han desaparecido de la pantalla
Janusz

bien, luego establezca el ancho del diseño tanto en fill_parent como en pesos a 0.5
jqpubliq

mira esto y esto . Estoy un poco confundido sobre por qué esto todavía no funciona, pero tal vez esto te dará algunas ideas.
jqpubliq

7

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 es cero

cálculo para asignar cualquier espacio restante / adicional entre el niño. (no el espacio total)

Asignación de espacio 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 un peso (0), entonces el espacio restante / extra se asigna a

1st text box = 1/(1+1+0) 
2nd text box = 1/(1+1+0) 
3rd text box = 0/(1+1+0) 

Ejemplo (2) : supongamos que tenemos una etiqueta de texto y dos elementos de edición de texto en una fila horizontal. La etiqueta no tiene un layout_weight especificado, por lo que ocupa el espacio mínimo requerido para renderizar. Si el diseño_peso 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 afirmamos que son igualmente importantes).

calculation : 
1st label = 0/(0+1+1) 
2nd text box = 1/(0+1+1) 
3rd text box = 1/(0+1+1)

Si el primer cuadro de texto tiene un diseño_peso de 1 y el segundo cuadro de texto tiene un diseño_peso de 2, entonces un tercio del espacio restante se asignará al primero y dos tercios al segundo (porque afirmamos que el segundo es más importante).

calculation : 
1st label = 0/(0+1+2) 
2nd text box = 1/(0+1+2) 
3rd text box = 2/(0+1+2) 

7

En el campo ancho del botón, reemplace wrap-contentcon 0dp.
Utilice el atributo layout_weight de una vista.

android:layout_width="0dp"  

Así es como se verá su código:

<LinearLayout
 android:layout_width="fill_parent"
 android:layout_height="wrap_content"
 android:orientation="horizontal">

 <Button
    android:text="Register"
    android:id="@+id/register"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:padding="10dip"
    android:layout_weight="1" />

 <Button
    android:text="Not this time"
    android:id="@+id/cancel"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:padding="10dip"
    android:layout_weight="1" />    

</LinearLayout>

layout_weight se usa para distribuir el espacio restante en proporciones. En este caso, los dos botones están tomando el ancho "0dp". Por lo tanto, el espacio restante se dividirá en una proporción de 1: 1 entre ellos, es decir, el espacio se dividirá en partes iguales entre las Vistas de botones.


6

Como respuesta de @Manoj Seelan

Reemplazar android:layout_weightcon android:weight.

Cuando usas Weight con LinearLayout. debe agregar weightSumen LinearLayouty de acuerdo con la orientación de su LinearLayoutdebe establecer 0dppara la anchura / altura a todos LinearLayout`s vistas Niños

Ejemplo:

Si la orientación de Linearlayoutes Vertical, establezca el ancho de todas LinearLayoutlas vistas secundarias con0dp

 <LinearLayout
     android:layout_width="fill_parent"
     android:layout_height="wrap_content"
     android:orientation="vertical"
     android:weightSum="3">

     <Button
        android:text="Register"
        android:id="@+id/register"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:padding="10dip"
        android:layout_weight="2" />

     <Button
        android:text="Not this time"
        android:id="@+id/cancel"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:padding="10dip"
        android:layout_weight="1" />

  </LinearLayout>

Si la orientación Linearlayoutde es horizontal, entonces Establecer Altura de todas LinearLayoutlas vistas de Niños con 0dp.

 <LinearLayout
     android:layout_width="fill_parent"
     android:layout_height="wrap_content"
     android:orientation="horizontal"
     android:weightSum="3">

     <Button
        android:text="Register"
        android:id="@+id/register"
        android:layout_width="wrap_content"
        android:layout_height="0dp"
        android:padding="10dip"
        android:layout_weight="2" />

     <Button
        android:text="Not this time"
        android:id="@+id/cancel"
        android:layout_width="wrap_content"
        android:layout_height="0dp"
        android:padding="10dip"
        android:layout_weight="1" />

  </LinearLayout>

5

Quizás configurar los dos botones de propiedades de layout_width en "fill_parent" hará el truco.

Acabo de probar este código y funciona en el emulador:

<LinearLayout android:layout_width="fill_parent"
          android:layout_height="wrap_content">

    <Button android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:text="hello world"/>

    <Button android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:text="goodbye world"/>

</LinearLayout>

Asegúrese de establecer layout_width en "fill_parent" en ambos botones.


1
esto solo empuja el botón derecho fuera de la pantalla y muestra solo el primer botón.
Janusz

4
<LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/logonFormButtons"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:baselineAligned="true"       
        android:orientation="horizontal">

        <Button
            android:id="@+id/logonFormBTLogon"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"            
            android:text="@string/logon"
            android:layout_weight="0.5" />

        <Button
            android:id="@+id/logonFormBTCancel"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"            
            android:text="@string/cancel"
            android:layout_weight="0.5" />
    </LinearLayout>

Ahora prefiero usar layout_weight = "50" y layout_width = "0px"
Yar

2

En el XML anterior, configure el android:layout_weightdiseño lineal como 2: android:layout_weight="2"


3
¿Por qué es eso necesario? ¿Por qué es importante el peso del diseño de 2? ¿Por qué no 20 o 200?
Conrad Frix

2

Además, debe agregar esto android:layout_width="0dp"para las vistas secundarias [Vistas de botones] deLinerLayout


2

Tienes que escribir así, funciona para mí

<LinearLayout
         android:layout_width="fill_parent"
         android:layout_height="wrap_content"
         android:orientation="horizontal"
            android:weightSum="2">

         <Button
            android:text="Register"
            android:id="@+id/register"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:padding="10dip"
            android:layout_weight="1" />

         <Button
            android:text="Not this time"
            android:id="@+id/cancel"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:padding="10dip"
            android:layout_weight="1" />

2

A continuación se muestran los cambios (marcados en negrita ) en su código:

<LinearLayout
     android:layout_width="fill_parent"
     android:layout_height="wrap_content"
     android:orientation="horizontal">

     <Button
        android:text="Register"
        android:id="@+id/register"
        android:layout_width="0dp" //changes made here
        android:layout_height="wrap_content"
        android:padding="10dip"
        android:layout_weight="1" /> //changes made here

     <Button
        android:text="Not this time"
        android:id="@+id/cancel"
        android:layout_width="0dp" //changes made here
        android:layout_height="wrap_content"
        android:padding="10dip"
        android:layout_weight="1" /> //changes made here

  </LinearLayout>

Dado que LinearLayout tiene una orientación horizontal, por lo tanto, deberá mantener su ancho solo como 0dp. por usar pesas en esa dirección. (Si su orientación fuera vertical, habría mantenido su altura solo 0dp) .

Dado que hay 2 vistas y las ha colocado android:layout_weight="1"para ambas vistas, significa que dividirá las dos vistas por igual en dirección horizontal (o por ancho).


1
 <LinearLayout
    android:layout_width="fill_parent"
    android:layout_height="wrap_content">

    <Button
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_weight="2"
        android:text="Button 1" />

    <Button
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_weight="3"
        android:text="Button 2" />

    <Button
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_weight="2"
        android:text="Button 3" />

    </LinearLayout>

0

Esta es la respuesta perfecta a tu problema

  <LinearLayout 
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content"
        android:orientation="horizontal"  >   
     <Button 
        android:text="Register" android:id="@+id/register"
        android:layout_width="wrap_content" android:layout_height="wrap_content"
        android:padding="10dip" weight="1" />
     <Button 
        android:text="Not this time" android:id="@+id/cancel"
        android:layout_width="wrap_content" android:layout_height="wrap_content"
        android:padding="10dip" weight="1" />
  </LinearLayout>

3
Entonces, ¿es "peso" o "diseño_peso"?
IgorGanapolsky

Es android: layout_weight
Mahendra Gunawardena


0
 <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_gravity="center"
            android:background="#008">

            <RelativeLayout
                android:id="@+id/paneltamrin"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:gravity="center"

                >
                <Button
                    android:id="@+id/BtnT1"
                    android:layout_width="wrap_content"
                    android:layout_height="150dp"
                    android:drawableTop="@android:drawable/ic_menu_edit"
                    android:drawablePadding="6dp"
                    android:padding="15dp"
                    android:text="AndroidDhina"
                    android:textColor="#000"
                    android:textStyle="bold" />
            </RelativeLayout>

            <RelativeLayout
                android:id="@+id/paneltamrin2"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:gravity="center"
                >
                <Button
                    android:layout_width="wrap_content"
                    android:layout_height="150dp"
                     android:drawableTop="@android:drawable/ic_menu_edit"
                    android:drawablePadding="6dp"
                    android:padding="15dp"
                    android:text="AndroidDhina"
                    android:textColor="#000"
                    android:textStyle="bold" />

            </RelativeLayout>
        </LinearLayout>

ingrese la descripción de la imagen aquí

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.