Android: como fazer uma visualização crescer para preencher o espaço disponível?

89

Isso parece simples, mas não consigo descobrir como fazer isso. Eu tenho um layout horizontal com um EditText e dois ImageButtons. Quero que os ImageButtons tenham um tamanho fixo e que o EditText ocupe o espaço restante no layout. Como pode ser isto alcançado?

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

Respostas:

51

tente isso em 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>
Sunil Pandey
fonte
4
Obrigado. Isso funciona muito bem. (Exceto que os ImageButtons devem ser definidos antes do EditText, como Joseph observou).
ab11
1
fill_parent - esta constante está obsoleta a partir do nível 8 da API e foi substituída por {@code match_parent}.
Zon
144

Se você quiser manter o layout igual (ou seja, botões após o texto), use a layout_weightpropriedade, junto com fill_parent, assim:

<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 o EditText'peso' faz com que seja descoberto por último e dá precedência aos botões. Jogue com os diferentes lay_weights e veja o quanto você pode se divertir!

Jonathan
fonte
1
Obrigado. Eu tenho em meu layout 3 áreas (cabeçalhos, conteúdo - WebView e rodapé). Resolvi o problema definindo o WebView layout_weight = 1 e layout_weight de rodapé = 0.
MKK
Não sabia o truque de definir o peso e 0 dp para apenas uma criança. Obrigado!
Marcel Bro de
1
isso geralmente é considerado as melhores práticas? É interessante que você possa influenciar a ordem em que o android resolve as visualizações.
Cypress Frankenfeld de
2
largura deve ser mantida 0, eu acho
Bibaswann Bandyopadhyay
19

OK:

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

Os pontos principais do layout são:

  • Os itens com tamanho fixo são colocados primeiro no layout, desta forma, quando o Android chega a calcular a altura da altura das coisas, fill_parentposteriormente no arquivo ele leva em consideração apenas o espaço restante, nem todo o espaço que poderia ocupar se nada mais estava lá
  • O EditText tem uma altura de fill_parent( match_parentem 2.2+) para que ocupe o resto do espaço disponível

Desculpe, não li sua pergunta o suficiente. O código acima fornece a resposta se você quiser fazer isso de forma vertical. Para um layout horizontal, o código postado por @Sunil deve funcionar.

Joseph Earl
fonte
Obrigado Joseph. Isso funciona. Porém, eu dei crédito a Sunil por ser um pouco mais rápido.
ab11
13

Use definir o layout_widthou layout_heightpara 0dp(pela orientação que você deseja preencher o espaço restante). Em seguida, use o layout_weightpara preencher o espaço restante.

Taynguyen
fonte