Android: как увеличить размер представления, чтобы заполнить доступное пространство?

91

Это кажется простым, но я не могу понять, как это сделать. У меня горизонтальный макет с EditText и двумя ImageButton. Я хочу, чтобы ImageButtons имел фиксированный размер, а EditText занимал оставшееся место в макете. Как этого добиться?

<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
источник

Ответы:

51

попробуйте это в относительной компоновке

<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
Спасибо. Это прекрасно работает. (За исключением того, что ImageButtons должен быть определен перед EditText, как заметил Джозеф).
ab11
1
fill_parent - эта константа устарела, начиная с уровня API 8, и заменена на {@code match_parent}.
Zon
149

Если вы хотите, чтобы макет оставался прежним (например, кнопки после текста), используйте layout_weightсвойство вместе с fill_parent:

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

Присвоение EditText«веса» делает его последним и дает приоритет кнопкам. Поиграйте с разными layout_weights и посмотрите, сколько удовольствия вы получите!

Джонатан
источник
1
Спасибо. В моем макете есть 3 области (заголовки, контент - WebView и нижний колонтитул), проблема решена путем установки WebView layout_weight = 1 и footer layout_weight = 0.
MKK
Не знал трюка с установкой веса и 0dp только для одного ребенка .. Спасибо!
Марсель Бро,
1
считается ли это передовой практикой? Интересно, что вы можете влиять на порядок, в котором Android разрешает просмотры.
Cypress Frankenfeld
2
ширину следует сохранить 0 Я думаю
Бибасванн Бандйопадхай
19

Хорошо:

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

Ключевые моменты макета:

  • Элементы фиксированного размера размещаются первыми в макете, таким образом, когда Android доходит до расчета высоты вещей с fill_parentпоследующим в файле, он учитывает только оставшееся пространство, а не все пространство, которое оно могло бы занять, если бы больше ничего там не было
  • EditText имеет высоту fill_parent( match_parentв 2.2+), так что он занимает остальное доступное пространство.

Извините, не прочитал ваш вопрос будет достаточно. Приведенный выше код дает ответ, если вы хотите сделать это вертикально. Для горизонтального макета должен работать код, опубликованный @Sunil.

Джозеф Эрл
источник
Спасибо, Джозеф. Это действительно работает. Хотя я отдал должное Сунилу за то, что он был немного быстрее.
ab11
15

Используйте установите layout_widthили layout_heightна 0dp(По ориентации, которую вы хотите заполнить оставшееся пространство). Затем используйте, layout_weightчтобы заполнить оставшееся пространство.

Taynguyen
источник