Android: come far crescere una visualizzazione per riempire lo spazio disponibile?


91

Sembra semplice, ma non riesco a capire come farlo. Ho un layout orizzontale con un EditText e due ImageButtons. Voglio che gli ImageButtons abbiano una dimensione fissa e che EditText occupi lo spazio rimanente nel layout. Come si può ottenere questo risultato?

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

Risposte:


51

provalo nel layout 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>

4
Grazie. Funziona alla grande. (Tranne che gli ImageButtons devono essere definiti prima dell'EditText, come ha notato Joseph).
ab11

1
fill_parent: questa costante è obsoleta a partire dal livello API 8 ed è sostituita da {@code match_parent}.
Zon

149

Se vuoi mantenere lo stesso layout (cioè i pulsanti dopo il testo), usa la layout_weightproprietà, insieme a fill_parent, così:

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

Dare il EditText'peso' lo fa capire per ultimo e dà la precedenza ai pulsanti. Gioca con i diversi layout_weights e scopri quanto puoi divertirti!


1
Grazie. Ho nel mio layout 3 aree (intestazioni, contenuto - WebView e piè di pagina) ha risolto il problema impostando il layout_weight di WebView = 1 e layout_weight = 0.
MKK

Non conoscevo il trucco con l'impostazione del peso e 0dp per un solo bambino .. Grazie!
Marcel Bro

1
questo è generalmente considerato best practice? È interessante che tu possa influenzare l'ordine in cui Android risolve le visualizzazioni.
Cypress Frankenfeld

2
la larghezza dovrebbe essere mantenuta 0 penso
Bibaswann Bandyopadhyay

19

Va bene:

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

I punti chiave del layout sono:

  • Gli elementi con dimensione fissa vengono inseriti per primi nel layout, in questo modo quando Android arriva a calcolare l'altezza dell'altezza delle cose con fill_parent poi nel file prende in considerazione solo lo spazio rimanente, non tutto lo spazio che potrebbe eventualmente occupare non c'era nient'altro
  • L'EditText ha un'altezza di fill_parent( match_parentin 2.2+) in modo che occupi il resto dello spazio disponibile

Mi dispiace, non ho letto la tua domanda sarà sufficiente. Il codice sopra fornisce la risposta se vuoi farlo in modo verticale. Per un layout orizzontale il codice pubblicato da @Sunil dovrebbe funzionare.


Grazie Giuseppe. Questo funziona. Tuttavia, ho dato credito a Sunil per essere leggermente più veloce.
ab11

15

Utilizzare impostare layout_widtho layout_heightsu 0dp(In base all'orientamento si desidera riempire lo spazio rimanente). Quindi usa il layout_weightper riempire lo spazio rimanente.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.