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

Это кажется простым, но я не могу понять, как это сделать. У меня горизонтальная компоновка с EditText и двумя ImageButtons. Я хочу, чтобы 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>

Ответ 1

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

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

Ответ 2

Если вы хотите сохранить макет тем же (т.е. кнопки после текста), используйте свойство 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 'weight' заставляет его задуматься последним и дает преимущество кнопкам. Играйте с разными layout_weights и посмотрите, сколько удовольствия вы можете иметь!

Ответ 3

Итак:

<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, должен работать.

Ответ 4

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