ScrollView不会滚动到内部LinearLayout底部边距的末尾

时间:2013-05-08 14:27:52

标签: android android-layout android-linearlayout android-scrollview

我遇到了包含一个包含LinearLayout的ScrollView的Fragment问题。我正在尝试创建一种效果,其中LinearLayout具有白色背景,看起来像一张纸在彩色背景上滚动。我试图实现这一目标的方法是让ScrollView占据片段的整个空间,然后内部的LinearLayout具有android:layout_margin="16dp"来创建“纸张”周围的空间。

这样,ScrollView的滚动条显示在彩色背景区域中,顶部的边距与内容一起滚动,底部的边距仅在到达结尾时滚动。

不幸的是,在这种配置中,ScrollView不会一直滚动到最后,实际上会截断底部的非常少量的文本。我怀疑ScrollView没有在其垂直滚动距离中考虑其孩子的边距。为了解决这个问题,我将LinearLayout包装在一个解决问题的FrameLayout中,但似乎是多余的。关于如何消除这种不需要的容器的任何指示都将不胜感激。

注意:在ScrollView上设置android:padding="16dp"并删除边距不会产生预期的效果,因为无论滚动位置如何,填充都会连续显示在所有四个边上。

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

3 个答案:

答案 0 :(得分:5)

我记得当内容布局有一个上边距时,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的开头也使用了类似的空视图,以完全避免上/下边距。

编辑:我刚刚意识到你还希望在到达视图结尾时显示“纸张”的结尾。在这种情况下,您可能希望将背景颜色设置为TextView而不是布局本身。然后确保标题和文章之间没有边距(使用填充作为分隔)。

EDIT2:我应该学会检查问题的时间......好吧,也许这对某人有帮助。 :)

答案 1 :(得分:1)

这个问题已经过时了,但是我在卷绕FrameLayout时遇到了ScrollView不正常的问题。它似乎也没有考虑包含布局的边缘。您可以将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" >
<!--...-->

答案 2 :(得分:0)

我将摆脱FrameLayout并将LinearLayout的{​​{1}}的孩子设为ScrollView作为布局高度。如果仍然不起作用,请考虑将另一个match_parent替换为具有所需高度和背景的下边距作为View中的最后一项。