Проблемы с пониманием Android XML layout_weight - PullRequest
17 голосов
/ 17 сентября 2010

Я действительно пытался, но я не могу понять, как Android интерпретирует layout_weight настройку ...

Я пытаюсь добиться

  • заголовка наtop с фиксированной высотой
  • область ввода внизу, содержащая EditText и Button
  • часть содержимого в середине, которая занимает все оставшееся пространство

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

Если я определю конкретную высоту для внутреннего LinearLayout, оно не будет расти.Если я этого не сделаю, внутренний макет занимает ВСЕ пространство вместо ScrollView, независимо от того, что я пытаюсь использовать layout_weight.: (

Мой текущий XML выглядит так:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >
    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="I'm a header" />
    <ScrollView
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_weight="1"
        android:gravity="bottom">
        <LinearLayout
            android:id="@+id/itemContainer"
            android:orientation="vertical"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content" />
    </ScrollView>
    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="50dp"
        android:padding="2dp"
        android:gravity="bottom"
        android:isScrollContainer="true"
        android:background="@drawable/steel" >
        <EditText
            android:id="@+id/edittext01"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_weight="0.2"
            android:scrollbars="vertical"
            android:fadingEdge="vertical"
            android:fadingEdgeLength="60dp"
            android:maxHeight="40dp"
            android:textSize="15sp" />
        <Button
            android:id="@+id/button"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_weight="0.8"
            android:layout_gravity="right"
            android:text="Send"
            android:textStyle="bold"
            android:textSize="15sp" />
    </LinearLayout>
</LinearLayout>

Любые советы приветствуются!

Ответы [ 4 ]

37 голосов
/ 17 сентября 2010

layout_weight используется для определения того, как Android разделяет оставшееся пространство после того, как различные виджеты получают все необходимое пространство.

Допустим, у вас есть 3 виджета в ряд, каждый из которых требует 10 пикселей, но у вас есть пространство на 50 пикселей.Вот несколько примеров layout_weights и количество пикселей, которое будет требовать каждый виджет:

widget1: weight = 1, 30px
widget2: weight = 0, 10px
widget3: weight = 0, 10px

widget1: weight = 1, 20px
widget2: weight = 1, 20px
widget3: weight = 0, 10px

widget1: weight = 1, 16.5px
widget2: weight = 1, 16.5px
widget3: weight = 1, 16.5px

Вы можете представить вес в процентах от доступного пространства.Он сложит все значения, а затем выдаст порции в зависимости от ситуации.Таким образом, если это поможет, вы можете использовать веса, которые добавляют до 100, чтобы сделать проценты:

widget1: weight = 0, 10px
widget2: weight = 25, 15px
widget3: weight = 75, 25px

Если я правильно понимаю, вы хотите, чтобы нижний виджет начинался с определенного размера, а затем расширялся до некоторого максимального размерапри необходимости, а затем прокрутите.

И вы хотите, чтобы виджет над ним занял все дополнительное пространство.

К сожалению, в Android практически невозможно указать максимальный размер.Я думаю, что лучшее, что вы могли бы сделать, это дать ScrollView некоторый фиксированный размер с layout_weight = 1 и сообщить нижней LinearLayout wrap_content.Это (я думаю) заставит LinearLayout расширяться, пока он больше не сможет, потому что ScrollView уже потребовал пространство.

Однако, вызов определяет фиксированный размер для ScrollView, который имеет смысл вообщеразные размеры экрана и разрешения.Возможно, вам придется создавать разные макеты для разных разрешений, что, вероятно, того не стоит.Лично я бы просто дал editText фиксированный размер ...

3 голосов
/ 07 ноября 2011

У меня была похожая проблема (нижний колонтитул с отметкой времени обновления, прикрепленной к нижней части экрана, и ListView / ScrollView, занимающий все оставшееся пространство), и после многих попыток он работал для меня, используя следующую схему:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
            android:layout_width="match_parent" 
            android:layout_height="match_parent">

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:layout_width="fill_parent"
              android:layout_height="fill_parent" 
              android:layout_above="@+id/refresh_date_text" 
              android:layout_alignParentTop="true"
              android:orientation="vertical" 
              >

    <ListView android:id="@android:id/list" android:layout_width="fill_parent"
        android:layout_height="fill_parent" android:background="#FFFFFF"
        android:layout_weight="1" android:divider="@drawable/list_divider"
        android:dividerHeight="1dp" android:drawSelectorOnTop="false" />

    <TextView android:id="@android:id/empty"
              android:layout_width="match_parent"
              android:layout_height="match_parent"
              android:background="#ffffff"
              android:gravity="center_horizontal"
              android:paddingTop="10dp"
              android:text="The list is empty."/>

</LinearLayout>

<TextView android:id="@+id/refresh_date_text"
          android:layout_width="match_parent" 
          android:layout_height="wrap_content" 
          android:layout_alignParentBottom="true"
          android:gravity="center_horizontal" 
          android:background="#f0f0f0" 
          android:textStyle="italic" 
          android:textSize="12dp"
          />
</RelativeLayout>

Отсутствует обрезка ListView при использовании скроллера, идеальное выравнивание во всех ориентациях, правильное отображение текста «список пуст».

1 голос
/ 17 сентября 2010

Полагаю, вам будет лучше с RelativeLayout. Добавьте свой заголовок и установите его на layout_alignParentTop="true". Затем добавьте свой EditText и Button, установите эту область на layout_alignParentBottom="true". Затем добавьте центральную область, установите ширину и высоту fill_parent и установите layout_above="{the id of the EditText/Button layout}" и layout_below="{the id of the header layout}".

У меня нет Eclipse на работе, иначе я бы проверил его для вас, но это должно сработать.

0 голосов
/ 16 апреля 2012
<LinearLayout
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:weightSum="1"
>
<TextView
 android:text=" TextView " 
 android:textColor="#ffffff"
 android:textSize="15sp"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:background="#ff0000"
 />
 <EditText
  android:text=" EditText " 
  android:textSize="15sp"
  android:layout_width="250dp"
  android:layout_weight="1"
  android:layout_height="0dp"
  />
 <Button
    android:text=" button " 
    android:textColor="#000000"
    android:textSize="15sp"
    android:gravity="center_vertical|center_horizontal"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    />
  </LinearLayout>

Это поможет

...