我遇到了包含一个包含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>
答案 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
中的最后一项。