ScrollView не прокручивается до конца внутреннего нижнего поля LinearLayout

У меня возникают проблемы с фрагментом, состоящим из ScrollView, содержащего LinearLayout. Я пытаюсь создать эффект, когда LinearLayout имеет белый фон и выглядит как лист бумаги, прокручиваемый на цветном фоне. Способ, которым я пытаюсь достичь этого, заключается в том, что ScrollView занимает полное пространство фрагмента, а затем LinearLayout внутри имеет android:layout_margin="16dp", чтобы создать пространство вокруг "бумаги".

Таким образом, полоса прокрутки ScrollView появляется в цветной области фона, верхний край прокручивается вместе с содержимым, а край внизу только прокручивается, когда он достигает конца.

К сожалению, в этой конфигурации ScrollView не будет прокручиваться до конца и фактически отсекает очень небольшое количество текста внизу. Я подозреваю, что ScrollView не учитывает его дочерние поля в своем вертикальном диапазоне прокрутки. Чтобы решить эту проблему, я завернул LinearLayout в FrameLayout, который решает проблему, но кажется излишним. Любые указатели на то, как устранить этот ненужный контейнер, будут оценены.

Примечание: установка android:padding="16dp" в ScrollView и обрезка полей не имеет желаемого эффекта, так как после этого прокладка появляется на всех четырех краях непрерывно, независимо от положения прокрутки.

<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    tools:context=".ArticleFragment" >

    <!-- This FrameLayout exists purely to force the outer ScrollView to respect
         the margins of the LinearLayout -->
    <FrameLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content">

        <LinearLayout
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical"
            android:padding="10dp"
            android:layout_margin="16dp"
            android:background="@color/page_background" >

            <TextView
                android:id="@+id/article_title"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:textAppearance="?android:attr/textAppearanceLarge"
                android:textIsSelectable="true" />

            <TextView
                android:id="@+id/article_content"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:textIsSelectable="true" />

       </LinearLayout>
    </FrameLayout>
</ScrollView>

Ответ 1

Я помню, что проблема с ScrollView каким-то образом не доходила до конца содержимого, когда макет содержимого имел верхний край. Я решил проблему с небольшим взломом, добавив пустой конец в конец LinearLayout:

<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    tools:context=".ArticleFragment" >

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:padding="10dp"
        android:layout_margin="16dp" >

        <TextView
            android:id="@+id/article_title"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:textAppearance="?android:attr/textAppearanceLarge"
            android:textIsSelectable="true"
            android:background="@color/page_background" />

        <TextView
            android:id="@+id/article_content"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:textIsSelectable="true"
            android:background="@color/page_background" />


        <!-- Add a little space to the end -->
        <View
            android:layout_width="fill_parent"
            android:layout_height="30dp" />

   </LinearLayout>
</ScrollView>

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

EDIT: Я просто понял, что вы также хотели, чтобы конец "бумаги" отображался при достижении конца представления. В этом случае вам может потребоваться установить цвет фона на TextView вместо самого макета. Затем убедитесь, что между заголовком и статьей нет поля (используйте дополнение в качестве разделения).

EDIT2: я должен научиться проверять, когда были заданы вопросы... Ну, может быть, это все еще помогает кому-то.:)

Ответ 2

Вопрос старый, но у меня возникли проблемы с тем, что ScrollView плохо себя ведет при упаковке FrameLayout. Он также, похоже, не учитывает края содержащихся макетов. Вы можете заменить FrameLayout еще одним LinearLayout с одним ребенком, который должен правильно измерять. Я бы полностью удалил FrameLayout и просто добавил суммарную маржу с заполнением на внутреннем макете:

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content">

        <LinearLayout
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical"
            android:padding="26dp"
            android:background="@color/page_background" >
<!--...-->

Ответ 3

Я бы избавился от FrameLayout и сделал LinearLayout дочерний элемент ScrollView с match_parent установленным как высота макета. Если это все еще не работает, подумайте о замене нижнего поля на другое произвольное View на нужную высоту и фон как последний элемент в LinearLayout.