Проблемы с планировкой Android

Я не могу, чтобы жизнь меня поняла. Я пытаюсь иметь следующий макет (по вертикали):

ImageView (заполнение всего доступного пространства) TextView (при необходимости занимает вертикальное пространство) EditText (при необходимости занимает вертикальное пространство) Кнопка Button Button (на одинаковом расстоянии)

У меня есть следующая настройка макета. В настоящее время представление изображения установлено на 200dip. Каким должно быть это значение для заполнения всего доступного пространства? Остальные компоненты должны быть первыми, и изображение должно получить то, что осталось. Я искал пример по этому поводу и еще ничего не нашел.

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" > <ImageView android:id="@+id/imgView" android:layout_width="fill_parent" android:layout_height="200dip" android:layout_alignParentTop="true" /> <TextView android:id="@+id/lblDesc" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/PhotoDesc" android:layout_below="@id/imgView" /> <EditText android:id="@+id/edtDesc" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_below="@id/lblDesc" /> <!-- Bottom layout contains the three buttons - Take Photos, Transmit, and Setup. --> <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:orientation="horizontal" android:weightSum="3"> <!-- Take photos button --> <Button android:id="@+id/btnCamera" android:gravity="center_vertical|center_horizontal" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_weight="1" android:text="@string/TakePhotos" /> <!-- Transmit button --> <Button android:id="@+id/btnUpload" android:gravity="center_vertical|center_horizontal" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_weight="1" android:text="@string/Upload" /> <!-- Setup button --> <Button android:id="@+id/btnSetup" android:gravity="center_vertical|center_horizontal" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/Setup" android:layout_weight="1" /> </LinearLayout> </RelativeLayout> 

Похоже, все, что вам нужно, это LinearLayout с соответствующим весом на ImageView чтобы взять оставшееся пространство.

Layout_weight с LinearLayout часто неправильно понимается. LinearLayout измеряет своих детей за два прохода. Во-первых, дети измеряются на основе заданного layout_width или layout_height, после того как все дети были измерены, оставшееся лишнее пространство делится в зависимости от их веса.

Это означает две важные вещи:

  • Вы никогда не хотите говорить match_parent (или fill_parent в более старых версиях) с весом в направлении макета. (Т.е. layout_width="match_parent" для LinearLayout с orientation="horizontal" или layout_height="match_parent" для orientation="vertical" .) Match_parent вступит в силу сначала, потребляя все доступное в данный момент пространство и не оставляя оставшихся оставшихся детей ,
  • Если вы хотите разделить пространство поровну между несколькими видами с весом или один вид потребляет все пространство, оставшееся без учета фактического размера содержимого, используйте 0dip в качестве значения layout_width или layout_height .

Попробуйте этот макет:

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <ImageView android:id="@+id/imgView" android:layout_width="match_parent" android:layout_height="0dip" android:layout_weight="1" /> <TextView android:id="@+id/lblDesc" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/PhotoDesc" android:layout_below="@id/imgView" /> <EditText android:id="@+id/edtDesc" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@id/lblDesc" /> <!-- Bottom layout contains the three buttons - Take Photos, Transmit, and Setup. --> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:weightSum="3"> <!-- Take photos button --> <Button android:id="@+id/btnCamera" android:gravity="center_vertical|center_horizontal" android:layout_width="0dip" android:layout_height="wrap_content" android:layout_weight="1" android:text="@string/TakePhotos" /> <!-- Transmit button --> <Button android:id="@+id/btnUpload" android:gravity="center_vertical|center_horizontal" android:layout_width="0dip" android:layout_height="wrap_content" android:layout_weight="1" android:text="@string/Upload" /> <!-- Setup button --> <Button android:id="@+id/btnSetup" android:gravity="center_vertical|center_horizontal" android:layout_width="0dip" android:layout_height="wrap_content" android:text="@string/Setup" android:layout_weight="1" /> </LinearLayout> </LinearLayout> 

Измените RelativeLayout на LinearLayout с помощью android:orientation="vertical" , затем добавьте android:layout_weight="1" в ваш ImageView.

Пример кода ниже. Я установил фон ImageView на красный цвет, чтобы увидеть эффект.

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical"> <ImageView android:id="@+id/imgView" android:layout_width="fill_parent" android:layout_height="0dp" android:layout_alignParentTop="true" android:layout_weight="1" android:background="#FF0000" /> <TextView android:id="@+id/lblDesc" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="test" /> <EditText android:id="@+id/edtDesc" android:layout_width="fill_parent" android:layout_height="wrap_content" /> <!-- Bottom layout contains the three buttons - Take Photos, Transmit, and Setup. --> <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:orientation="horizontal" android:weightSum="3"> <!-- Take photos button --> <Button android:id="@+id/btnCamera" android:gravity="center_vertical|center_horizontal" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_weight="1" android:text="btn1" /> <!-- Transmit button --> <Button android:id="@+id/btnUpload" android:gravity="center_vertical|center_horizontal" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_weight="1" android:text="btn2" /> <!-- Setup button --> <Button android:id="@+id/btnSetup" android:gravity="center_vertical|center_horizontal" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="btn3" android:layout_weight="1" /> </LinearLayout> </LinearLayout>