Android: comment faire grossir une vue pour remplir l'espace disponible?

89

Cela semble simple, mais je ne sais pas comment le faire. J'ai une disposition horizontale avec un EditText et deux ImageButtons. Je souhaite que les ImageButtons aient une taille fixe et que EditText occupe l'espace restant dans la mise en page. Comment cela peut-il être accompli?

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

Réponses:

51

essayez ceci dans une disposition relative

<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
la source
4
Je vous remercie. Cela fonctionne très bien. (Sauf que les ImageButtons doivent être définis avant le EditText, comme Joseph l'a noté).
ab11
1
fill_parent - Cette constante est obsolète à partir du niveau d'API 8 et est remplacée par {@code match_parent}.
Zon du
144

Si vous souhaitez conserver la même mise en page (c'est-à-dire les boutons après le texte), utilisez la layout_weightpropriété, avec fill_parent, ainsi:

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

Donner le EditText«poids» le fait passer en dernier et donne la priorité aux boutons. Jouez avec les différents layout_weights et voyez à quel point vous pouvez vous amuser!

Jonathan
la source
1
Je vous remercie. J'ai dans ma mise en page 3 zones (en-têtes, contenu - WebView et pied de page), cela a résolu le problème en définissant WebView layout_weight = 1 et le pied de page layout_weight = 0.
MKK
Je ne connaissais pas le truc avec le réglage du poids et 0dp à un seul enfant .. Merci!
Marcel Bro
1
est-ce généralement considéré comme les meilleures pratiques? Il est intéressant que vous puissiez influencer l'ordre dans lequel Android résout les vues.
Cypress Frankenfeld
2
la largeur doit être conservée 0 je pense
Bibaswann Bandyopadhyay
19

D'accord:

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

Les points clés de la mise en page sont:

  • Les éléments de taille fixe sont placés en premier dans la mise en page, de cette façon, lorsque Android vient de calculer la hauteur de la hauteur des choses avec fill_parentplus tard dans le fichier, il ne prend en compte que l'espace restant, pas tout l'espace qu'il pourrait éventuellement occuper si rien d'autre n'était là
  • Le EditText a une hauteur de fill_parent( match_parenten 2.2+) afin qu'il occupe le reste de l'espace disponible

Désolé, vous n'avez pas suffisamment lu votre question. Le code ci-dessus fournit la réponse si vous souhaitez le faire de manière verticale. Pour une mise en page horizontale, le code publié par @Sunil devrait fonctionner.

Joseph Earl
la source
Merci Joseph. Cela fonctionne. Cependant, j'ai rendu hommage à Sunil pour être légèrement plus rapide.
ab11
13

Utilisez pour régler layout_widthou layout_heightsur 0dp(selon l'orientation que vous souhaitez remplir l'espace restant). Utilisez ensuite le layout_weightpour remplir l'espace restant.

taynguyen
la source