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
.