Android: ¿cómo hacer que una vista crezca para llenar el espacio disponible?

90

Esto parece sencillo, pero no sé cómo hacerlo. Tengo un diseño horizontal con un EditText y dos ImageButtons. Quiero que ImageButtons sea de un tamaño fijo y que EditText ocupe el espacio restante en el diseño. ¿Cómo se puede lograr esto?

<LinearLayout 
        android:orientation="horizontal"
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content">
        <EditText 
            android:layout_width="wrap_content"
            android:layout_height="wrap_content">
        </EditText>
        <ImageButton 
            android:src="@drawable/img1"
            android:layout_width="50dip" 
            android:layout_height="50dip">
        </ImageButton>
        <ImageButton 
            android:src="@drawable/img2"
            android:layout_width="50dip" 
            android:layout_height="50dip">
        </ImageButton>
</LinearLayout>
ab11
fuente

Respuestas:

51

prueba esto en diseño relativo

<RelativeLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content">
    <ImageButton 
        android:id="@+id/btn1"
        android:src="@drawable/icon"
        android:layout_width="50dip" 
        android:layout_height="50dip"
        android:layout_alignParentRight="true"/>
    <ImageButton 
        android:id="@+id/btn2"
        android:src="@drawable/icon"
        android:layout_width="50dip" 
        android:layout_height="50dip"
        android:layout_toLeftOf="@+id/btn1"/>
    <EditText 
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_toLeftOf="@+id/btn2">
    </EditText>

</RelativeLayout>
Sunil Pandey
fuente
4
Gracias. Esto funciona muy bien. (Excepto que los ImageButtons deben definirse antes de EditText, como señaló Joseph).
ab11
1
fill_parent: esta constante está obsoleta a partir del nivel de API 8 y se reemplaza por {@code match_parent}.
Zona
147

Si desea mantener el diseño igual (es decir, botones después del texto), use la layout_weightpropiedad, junto con fill_parent, así:

<LinearLayout 
    android:orientation="horizontal"
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content">
    <EditText 
        android:layout_weight="1"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content">
    </EditText>
    <ImageButton 
        android:src="@drawable/img1"
        android:layout_width="50dip" 
        android:layout_height="50dip">
    </ImageButton>
    <ImageButton 
        android:src="@drawable/img2"
        android:layout_width="50dip" 
        android:layout_height="50dip">
    </ImageButton>
 </LinearLayout>

Dar el EditText"peso" hace que se descubra el último y da prioridad a los botones. ¡Juega con los diferentes layout_weights y descubre cuánto te puedes divertir!

Jonathan
fuente
1
Gracias. Tengo en mi diseño 3 áreas (encabezados, contenido, WebView y pie de página) que resolvió el problema configurando WebView layout_weight = 1 y footer's layout_weight = 0.
MKK
No conocía el truco para establecer el peso y 0dp para un solo niño. ¡Gracias!
Marcel Bro
1
¿Se considera esto generalmente las mejores prácticas? Es interesante que pueda influir en el orden en que Android resuelve las vistas.
Cypress Frankenfeld
2
el ancho debe mantenerse 0, creo
Bibaswann Bandyopadhyay
19

Bueno:

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

        <ImageButton 
            android:id="@+id/button1"
            android:src="@drawable/img1"
            android:layout_width="50dip"
            android:layout_alignParentTop="true" 
            android:layout_height="50dip">
        </ImageButton>
        <ImageButton 
            android:src="@drawable/img2"
            android:layout_width="50dip" 
            android:layout_alignParentTop="true"
            android:layout_toRightOf="@id/button1"
            android:layout_height="50dip">
        </ImageButton>
        <EditText 
            android:layout_below="@id/button"
            android:layout_width="wrap_content"
            android:layout_height="fill_parent">
        </EditText>
</RelativeLayout>

Los puntos clave del diseño son:

  • Los elementos con tamaño fijo se colocan primero en el diseño, de esta manera cuando Android llega a calcular la altura de la altura de las cosas con fill_parentmás adelante en el archivo, solo tiene en cuenta el espacio restante, no todo el espacio que podría ocupar si no había nada más allí
  • El EditText tiene una altura de fill_parent( match_parenten 2.2+) para que ocupe el resto del espacio disponible

Lo siento, no leí tu pregunta lo suficiente. El código anterior proporciona la respuesta si desea hacerlo de forma vertical. Para un diseño horizontal, el código publicado por @Sunil debería funcionar.

Joseph Earl
fuente
Gracias Joseph. Esto funciona. Sin embargo, le di crédito a Sunil por ser un poco más rápido.
ab11
13

Use establecer layout_widtho layout_heighten 0dp(Por la orientación que desea llenar el espacio restante). Luego use el layout_weightpara llenar el espacio restante.

taynguyen
fuente