Peso del diseño de Android

84

Soy nuevo en el desarrollo de Android y tengo una pregunta sobre cómo establecer el peso en un diseño lineal.

Estoy intentando crear una fila con dos botones personalizados y un texto de edición personalizado. El texto de edición solo debe ocupar tanto espacio como su contenido, y los dos botones deben expandirse horizontalmente para llenar el resto del espacio disponible en la fila. Me gusta esto...

| [#Button++#] [#Button--#] [et] |

Después de varios intentos, esto es lo más cerca que puedo llegar a lo que quiero, aunque parece demasiado complicado.

| [Button] [Button] [###ET###] |

<LinearLayout 
    android:orientation="horizontal"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:gravity="center_horizontal|center_vertical"
    android:layout_weight="1"
    >

    <LinearLayout 
        android:orientation="horizontal"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:gravity="center_horizontal|center_vertical"
        >
        <RelativeLayout 
            android:id="@+id/btn_plus_container" 
            android:layout_width="fill_parent" 
            android:layout_height="wrap_content"
            >
            <ImageButton 
                android:layout_height="wrap_content"
                android:layout_width="fill_parent" 
                android:id="@+id/btn_plus" 
                android:background="@drawable/btn"
                android:layout_centerInParent="true"
                ></ImageButton>
            <TextView 
                android:textColor="#FAFAF4"
                android:id="@+id/tv_dice_plus" 
                android:text="@string/tv_plus" 
                android:layout_width="wrap_content" 
                android:layout_height="wrap_content"
                android:layout_centerInParent="true"
                ></TextView>
        </RelativeLayout>
    </LinearLayout>
    <LinearLayout 
        android:orientation="horizontal"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:gravity="center_horizontal|center_vertical"
        >
        <RelativeLayout 
            android:id="@+id/btn_minus_container" 
            android:layout_width="fill_parent" 
            android:layout_height="wrap_content"
            >
            <ImageButton 
                android:layout_height="wrap_content"
                android:layout_width="fill_parent" 
                android:id="@+id/btn_minus" 
                android:background="@drawable/btn"
                android:layout_centerInParent="true"
                ></ImageButton>
            <TextView 
                android:textColor="#FAFAF4"
                android:id="@+id/btn_minus" 
                android:text="@string/tv_minus" 
                android:layout_width="wrap_content" 
                android:layout_height="wrap_content"
                android:layout_centerInParent="true"
                ></TextView>
        </RelativeLayout>
    </LinearLayout>
    <LinearLayout 
        android:orientation="horizontal"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:gravity="center_horizontal|center_vertical"
        >
        <EditText 
            android:textColor="#FAFAF4"
            android:text="@string/et_output" 
            android:id="@+id/et_output" 
            android:layout_width="wrap_content" 
            android:layout_height="wrap_content"
            android:inputType="number"
            android:selectAllOnFocus="true" 
            android:minWidth="50sp"         
            android:maxWidth="50sp"
            android:background="@drawable/tv_black_background3"
            android:textColorHighlight="#c30505"
            ></EditText>
    </LinearLayout>
</LinearLayout>

Según tengo entendido, configurar [android: layout_weight = "2"] para los diseños lineales que sostienen los botones debería hacer que ocupen más espacio que el texto de edición, pero hace lo contrario para mí, lo que hace que ambos tengan la mitad del tamaño.

| [Btn] [Btn] [#####et#####] |

He probado tantas combinaciones diferentes que ni siquiera puedo recordarlas, y ninguna ha funcionado.

DesafortunadoDiablo
fuente

Respuestas:

213

No funciona porque está utilizando fill_parent como ancho. El peso se usa para distribuir el espacio vacío restante o quitar espacio cuando la suma total es mayor que LinearLayout. Establezca sus anchos en 0dip en su lugar y funcionará.

Romain Guy
fuente
6
Establecer los anchos en los diseños lineales a 0dip funcionó como quería. No sabía que era una opción. Tiene sentido por qué eso funcionaría donde wrap_content no lo haría. Establecer el ancho en wrap_content cuando no hay contenido lo hace desaparecer, pero establecerlo en 0dip permite que se extienda desde nada hasta el tamaño que necesite. Muchas gracias.
UnluckyDevil
Configurar layout_width en "fill_parent" y layout_weight en un valor flotante como "0.2", "0.85", etc. también funciona. En este caso, cuanto mayor sea el número, menor será el tamaño de la vista. ¿Podría explicar si esta es una forma aceptable de hacerlo?
Yar
37
Esto funcionó para mí también. Gracias. (Aunque tengo que decir, ¿alguien más encuentra el sistema de diseño de Android extraño y poco intuitivo?)
tstyle
¡Gracias! Realmente tuve problemas para decir por qué los anchos de mi diseño no se mostraban como se esperaba. Fue la configuración de 0dip la que lo hizo :)
marlar
@tstyle android es fácil si quieres hacer cosas fáciles. Sin embargo, si quiere hacer algo más que cosas fáciles, se vuelve demasiado difícil.
Pacerier
14

android:Layout_weightse puede usar cuando no adjunta un valor fijo a su ancho, como, fill_parentetc.

Haz algo como esto:

<Button>

Android:layout_width="0dp"
Android:layout_weight=1

-----other parameters
</Button>
aprender_andrd
fuente
7

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

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

George Nguyen
fuente
3

En linearLayout, establezca WeightSum = 2;

Y distribuya el peso a sus hijos como quiere que muestren. Le he dado peso = "1" al niño. Así que ambos distribuirán la mitad del total.

 <LinearLayout
    android:id="@+id/linear1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:weightSum="2"
    android:orientation="horizontal" >

    <ImageView
        android:id="@+id/ring_oss"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:src="@drawable/ring_oss" />

    <ImageView
        android:id="@+id/maila_oss"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:src="@drawable/maila_oss" />
</LinearLayout>
AndroidGeek
fuente
2

los valores de peso 0-1 comparten la distribución del espacio disponible (después de configurar layout_width = "0px") en proporción al valor de peso. Los elementos de visualización con peso no especificado (sin entrada de peso) obtienen un peso 0, lo que significa que no obtienen ninguna expansión.

Una alternativa simple sin necesidad de entradas de peso es adjuntar marquesina a una vista con texto que le dice que se expanda desde el mínimo necesario para el texto (wrap_content) hasta el espacio disponible EditText: android: layout_width = "wrap_content" android: ellipsize = "marquee"

JDPearlman
fuente
0

Supongo que debo establecer el EditTextancho de s wrap_contenty colocar los dos botones en un LinearLayoutcuyo ancho es fill_parenty el peso se establece en 1.

Jonathan Roth
fuente
0

Una razón más que encontré (por vaga que parezca). Lo siguiente no funcionó.

LinearLayout vertical

LinearLayout altura relleno padre + peso

LinearLayout altura relleno padre + peso

LinearLayout altura relleno padre + peso

EndLinearLayout

Lo que funcionó fue

Disposición relativa

LinearLayout vertical

LinearLayout altura relleno padre + peso

LinearLayout altura relleno padre + peso

LinearLayout altura relleno padre + peso

EndLinearLayout

EndRelativeLayout

Suena vago por un diseño de raíz con Linear y los pesos debajo de él no funcionaron. Y cuando digo "no funcionó", quiero decir, que después de ver el diseño gráfico entre varias resoluciones, la consistencia de la pantalla se rompió a lo grande.

Siddharth
fuente
0
<LinearLayout
    android:id="@+id/linear1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:weightSum="9"
    android:orientation="horizontal" >

    <ImageView
        android:id="@+id/ring_oss"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="3"
        android:src="@drawable/ring_oss" />

    <ImageView
        android:id="@+id/maila_oss"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="3"
        android:src="@drawable/maila_oss" />
<EditText
        android:id="@+id/edittxt"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="3"
        android:src="@drawable/maila_oss" />
</LinearLayout>
Devendra Shah
fuente