Проблемы с макетом Android - PullRequest
       29

Проблемы с макетом Android

2 голосов
/ 27 февраля 2011

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

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

У меня есть следующие настройки макета. Просмотр изображения в настоящее время установлен на 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>

Ответы [ 2 ]

4 голосов
/ 27 февраля 2011

Похоже, все, что вам нужно, это 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>
3 голосов
/ 27 февраля 2011

Измените 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>
...