Android: jak sprawić, by widok wypełnił dostępną przestrzeń?

90

Wydaje się to proste, ale nie wiem, jak to zrobić. Mam układ poziomy z EditText i dwoma ImageButtons. Chcę, aby ImageButtons miały stały rozmiar, a EditText zajmował pozostałe miejsce w układzie. Jak można to osiągnąć?

<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
źródło

Odpowiedzi:

51

spróbuj tego w układzie względnym

<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
źródło
4
Dziękuję Ci. To działa świetnie. (Z wyjątkiem tego, że ImageButtons muszą być zdefiniowane przed EditText, jak zauważył Joseph).
ab11
1
fill_parent - ta stała jest przestarzała począwszy od poziomu API 8 i jest zastępowana przez {@code match_parent}.
Zon,
147

Jeśli chcesz zachować ten sam układ (czyli przyciski za tekstem), użyj layout_weightwłaściwości wraz z fill_parent, w ten sposób:

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

Podanie `` EditTextwagi '' sprawia, że ​​jest to ostatnie i daje pierwszeństwo przyciskom. Graj z różnymi layout_weights i zobacz, ile możesz się bawić!

Jonathan
źródło
1
Dziękuję Ci. Mam w swoim układzie 3 obszary (nagłówki, zawartość - WebView i stopka), rozwiązałem problem ustawiając WebView layout_weight = 1 i layout_weight = stopki = 0.
MKK
Nie znałam sztuczki z ustawieniem wagi i 0dp tylko jednemu dziecku .. Dziękuję!
Marcel Bro
1
czy jest to ogólnie uważane za najlepsze praktyki? Ciekawe, że możesz wpływać na kolejność, w jakiej android rozpatruje widoki.
Cypress Frankenfeld
2
szerokość powinna być zachowana 0 Myślę
Bibaswann Bandyopadhyay
19

W porządku:

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

Kluczowe punkty układu to:

  • Elementy o stałych rozmiarach są umieszczane jako pierwsze w układzie, w ten sposób, gdy Android oblicza wysokość wysokości rzeczy za pomocą fill_parent później w pliku bierze pod uwagę tylko pozostałą przestrzeń, a nie całą przestrzeń, którą mógłby ewentualnie zająć, gdyby nic więcej tam nie było
  • EditText ma wysokość fill_parent( match_parentw wersji 2.2+), więc zajmuje resztę dostępnego miejsca

Przepraszamy, ale nie przeczytałem twojego pytania wystarczy. Powyższy kod dostarcza odpowiedzi, jeśli chcesz to zrobić w sposób pionowy. W przypadku układu poziomego kod wysłany przez @Sunil powinien działać.

Joseph Earl
źródło
Dziękuję Joseph. To działa. Chociaż przyznałem Sunilowi, że był nieco szybszy.
ab11
13

Użyj ustaw layout_widthlub layout_heightna 0dp(według orientacji, w której chcesz wypełnić pozostałą przestrzeń). Następnie użyj, layout_weightaby wypełnić pozostałą przestrzeń.

taynguyen
źródło