Сложность с ScrollView и LinearLayout - PullRequest
       44

Сложность с ScrollView и LinearLayout

9 голосов
/ 04 сентября 2011

Я пытаюсь сделать макет Android: 3 компонента внутри вертикальной LinearLayout. Центральным компонентом является ScrollView, который содержит TextView. Когда TextView содержит значительное количество текста (больше, чем может поместиться на экране), ScrollView увеличивается до самого конца экрана, показывает полосы прокрутки и перемещает последний компонент, LinearLayout с Button внутри, вне экрана.

Если текст внутри TextView внутри ScrollView достаточно короткий, кнопка в нижней части экрана расположена идеально.

Макет, который я пытаюсь достичь:

image

XML для написанного мной макета:

<?xml version="1.0" encoding="UTF-8"?>

<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="wrap_content"
            android:layout_height="wrap_content"
            android:textColor="#FFFFFF"
            android:layout_marginLeft="10dip"
            android:layout_marginRight="10dip"
            android:layout_marginTop="10dip"
            android:layout_marginBottom="10dip"
            android:text="Title />

    <ScrollView
            android:layout_width="fill_parent"
            android:layout_height="wrap_content">

        <TextView android:id="@+id/text"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:autoLink="web"
                android:textColor="#FFFFFF"
                android:background="#444444"
                android:padding="10dip" />

    </ScrollView>

    <LinearLayout
            android:orientation="horizontal"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:layout_weight="1">

        <LinearLayout
                android:orientation="horizontal"
                android:layout_width="0dip"
                android:layout_height="wrap_content"
                android:layout_weight="1"/>

        <Button android:id="@+id/login_button"
                android:layout_width="0dip"
                android:layout_height="wrap_content"
                android:layout_gravity="bottom"
                android:layout_weight="1"
                android:text="@string/next_button"/>

    </LinearLayout>

</LinearLayout>

Ответы [ 4 ]

6 голосов
/ 04 сентября 2011

Вид прокрутки является вторым объектом просмотра и имеет значение wrap_content, которое больше экрана.

Я рекомендую RelativeLayout. Верхнее текстовое представление сначала с android:alignParentTop="true", нижнее LinearLayout затем с android:alignParentBottom="true" и прокручиваемое представление, перечисленное последним в xml со значением android:alignBelow="@id/whatYouCallTheHeader.

Это выровняет нижнюю панель внизу экрана и верхний колонтитул независимо от размера. Тогда у прокрутки будет свое место после размещения верхнего и нижнего колонтитулов.

2 голосов
/ 06 марта 2013

! [Фиксированный колонтитул и прокручиваемая раскладка тела] [1]


Это то, что вы ищете.Большинство приложений в Android имели такой тип макета, фиксированный верхний и нижний колонтитулы и прокручиваемое тело.XML для этого макета:


<?xml version="1.0" encoding="UTF-8"?>
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
        android:background="#5599DD"
        android:layout_height="fill_parent">
        <!-- Header goes here -->
       <TextView 
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textColor="#FFFFFF"
            android:layout_marginLeft="10dip"
            android:layout_marginRight="10dip"
            android:layout_marginTop="10dip"
            android:layout_marginBottom="10dip"
            android:textSize="20sp"
            android:layout_gravity="center"
            android:text="Title" />
       <!-- Body goes here -->
        <ScrollView
            android:layout_weight="1"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content">
            <TextView 
                android:id="@+id/text"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:autoLink="web"
                android:text="@string/lorem_ipsum"
                android:textColor="#FFFFFF"

                android:padding="10dip" />
        </ScrollView>
        <!-- footer goes here -->
        <LinearLayout
            android:layout_width="fill_parent"
            android:layout_height="wrap_content">
            <RelativeLayout
                android:layout_width="fill_parent"
                android:layout_height="fill_parent">
                <Button 
                    android:id="@+id/login_button"
                    android:layout_height="wrap_content"
                    android:layout_width="wrap_content"
                    android:layout_gravity="bottom"
                    android:layout_alignParentRight="true"
                    android:text="Button"/>

            </RelativeLayout>
     </LinearLayout>
</LinearLayout>
2 голосов
/ 23 августа 2012

Попробуйте добавить вес макета в ScrollView, т. Е.

<ScrollView
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_weight="1">

Это сработало для меня в ситуации, почти идентичной той, которую вы представляете, но заставило меня задуматься, почему, потому что это противоречит- интуитивно понятно, что увеличение веса макета элемента управления с 0 (по умолчанию, если вы не указываете layout_weight) до 1, должно сделать элемент управления, который уже использует слишком много места, меньшим.

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

2 голосов
/ 04 сентября 2011

Вы должны использовать относительный вывод, а не LinearLayout. И вы можете использовать некоторые свойства, такие как alignBelow и все.

...