12

我遇到了由包含 LinearLayout 的 ScrollView 组成的 Fragment 的问题。我正在尝试创建一种效果,其中 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>
4

3 回答 3

6

我记得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来完全避免顶部/底部边距。

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

EDIT2:我应该学会检查何时提出问题......好吧,也许这仍然可以帮助某人。:)

于 2013-10-24T16:21:48.227 回答
1

这个问题很老,但我在包装 FrameLayout 时遇到了 ScrollView 行为不端的问题。它似乎也没有考虑包含布局的边距。您可以用另一个应该正确测量的单子 LinearLayout 替换 FrameLayout。我会完全删除 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" >
<!--...-->
于 2016-10-28T15:33:41.077 回答
0

我会摆脱FrameLayout并将withLinearLayout的子级设置为布局高度。如果这仍然不起作用,请考虑将底部边距替换为具有所需高度和背景的另一个任意值作为.ScrollViewmatch_parentViewLinearLayout

于 2013-05-08T15:03:41.903 回答