Подтвердить что ты не робот

Проблемы с пониманием формата XML в формате XML

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

То, что я пытаюсь достичь,

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

При наборе текста я хотел бы увеличить 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>

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

4b9b3361

Ответ 1

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 фиксированный размер...

Ответ 2

У меня была аналогичная проблема (нижний колонтитул с обновленной меткой времени, прикрепленной к нижней части экрана, и 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 при скроллере, идеальное выравнивание во всех ориентациях, правильно отображающее текст "список пуст".

Ответ 3

Я считаю, что вам будет лучше с 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 на работе, иначе я бы тестировал его для вас, но это должно работать.

Ответ 4

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

Это поможет