33

我无法使 ScrollView 正确滚动。它总是切断底部的内容,就好像它是一个普通的LinearLayout一样。

我的代码

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fillViewport="true" >

    <LinearLayout android:id="@+id/scroll_layout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:isScrollContainer="true"
        android:orientation="vertical" >

当然,我已经尝试添加/删除“fillViewport”和“isScrollContainer”属性,它根本没有改变任何东西。

这适用于 ScrollView(仅限垂直)

Horizo​​ntalScrollView必须用于水平滚动。

4

14 回答 14

40

答:当用作 XML 布局的根元素时,ScrollView 不起作用。它必须被包裹在一个 LinearLayout 中。

然后解决方案:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <ScrollView android:id="@+id/scroll_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:fillViewport="true" >

        <LinearLayout android:id="@+id/scroll_layout"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical" >

        </LinearLayout>
    </ScrollView>
</LinearLayout>
于 2013-02-11T13:06:50.000 回答
12

❌尝试了上述所有答案,但我的问题仍未解决。经过一些调试和更改后,我的问题得到了解决,即 ScrollView 正在滚动。

  • 我们不需要向 ScrollView 添加任何父元素以使其滚动(如此处的其他一些答案中所述)。

✔️修复是针对我的问题✔️

  • 将 ScrollView 的高度更改为 0dp

    安卓:layout_height="0dp"

  • 将顶部和底部约束到父/相应视图/元素

    应用:layout_constraintTop_toBottomOf="@+id/imageView4" 应用:layout_constraintBottom_toBottomOf="父"

最终的 xml 看起来像这样

<ScrollView
    android:layout_width="match_parent"
    android:layout_height="0dp"
    app:layout_constraintTop_toBottomOf="@+id/imageView4"
    app:layout_constraintBottom_toBottomOf="parent">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">

           <!-- Loong content -->

    </LinearLayout>
</ScrollView>
于 2021-01-04T01:47:27.410 回答
7

Scroll View as Parent 没有问题。当我们将填充/边距添加到滚动视图的直接子级时,我遇到了这样的问题。保持滚动视图的子视图只有高度和宽度属性,它会正常工作。

    <ScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:animateLayoutChanges="true"
        android:fillViewport="true">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:animateLayoutChanges="true"
            android:orientation="vertical">
</LinearLayout>
</ScrollView>
于 2018-10-31T08:02:55.130 回答
3

所选答案不正确!

您可以使用 ScrollView 作为根视图,它对您不起作用,因为您缺少填充。

添加类似:

android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
于 2018-01-24T21:44:53.627 回答
2

删除android:isScrollContainerin LinearLayout。根据文档android:isScrollContainer用于设置可滚动的视图。我希望它对你有帮助。有关定义,请参阅此链接

于 2013-02-11T11:23:51.140 回答
2

Android Studio 将 NestedScrollView 添加到其某些模板(例如 Master-Detail)的活动文件中。在片段文件中有一个 ScrollView 并且在该片段的活动文件中有另一个会阻止滚动视图工作。在我的片段文件中删除 ScrollView 并将其留在活动文件中为我解决了这个问题。

于 2015-10-10T18:26:46.770 回答
2

试试这个解决方案,只需使用延迟后的方法来延迟滚动。

片段测试.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/rootRelativeLayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:fresco="http://schemas.android.com/apk/res-auto">

    <ScrollView
        android:id="@+id/scrollView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_marginTop="40dp"
        android:fillViewport="true"
        android:scrollbars="none">

        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content">
            ...
        </RelativeLayout>

    </ScrollView>

</RelativeLayout>

测试片段.java

...
private ScrollView mScrollView;
...
mScrollView = (ScrollView) mView.findViewById(R.id.scrollView);
mScrollView.setSmoothScrollingEnabled(true);
...
new Handler().postDelayed(new Runnable() {
    @Override
     public void run() {
         if(isAdded()) {
             // Scroll 1000px down
             mScrollView.smoothScrollTo(0, 1000);
         }
     }
}, 150);

这对我有用,希望这会有所帮助。

于 2017-06-09T07:09:04.657 回答
2

试试这个,

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="match_parent"
  android:layout_height="wrap_content"
  android:fillViewport="true" >

<LinearLayout android:id="@+id/scroll_layout"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical" >
于 2019-04-27T04:30:02.390 回答
1

我终于发现我花了 5 个小时逐步构建所有内容并一次测试每一步,呃....

无论如何,如果您对此有疑问,我发现 setOntouch 侦听器正在弄乱您的代码-至少在我的情况下是...

我必须想办法解决它,但尝试删除你的 ontouch 监听器并测试你的代码 - 它必须工作

于 2018-08-24T13:00:28.300 回答
0

这解决了我的问题:我添加android:isScrollContainer="true"到 LinearLayout 并删除了 ScrollView 代码之前:

    <LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent">
<ScrollView
    android:id="@+id/scrollViewRecords"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fillViewport="true">

    <LinearLayout
        android:id="@+id/sheepList"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical" >

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

代码之后

    <LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:isScrollContainer="true">

    <LinearLayout
        android:id="@+id/sheepList"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical" >

    </LinearLayout>
</LinearLayout>
于 2017-07-14T08:01:27.360 回答
0

有没有办法结束这个问题?它很旧,目前标记为有效的答案没有意义。现在关于 ScrollView 唯一有效的是:

允许滚动放置在其中的视图层次结构的视图组。滚动视图中可能只有一个直接子级。要在滚动视图中添加多个视图,请让您添加视图组的直接子级,例如 LinearLayout,并在该 LinearLayout 中放置其他视图。永远不要将 RecyclerView 或 ListView 添加到滚动视图。这样做会导致糟糕的用户界面性能和糟糕的用户体验。

取自官方文档:https ://developer.android.com/reference/android/widget/ScrollView.html

于 2017-09-26T18:42:45.887 回答
0
    <LinearLayout 
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">
    
        <ScrollView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:fillViewport="true">
    
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical">
......
</LinearLayout>
</ScrollView>
</LinearLayout>
于 2020-09-28T19:30:44.660 回答
0

看起来您没有使用某些属性和规则。

android:layout_height="0dp"
android:scrollbars="none"
android:fillViewport="true"

此外,在此之后尝试将所有滚动内容包装在Constraint Layout中。

<tech.loung.views.SlidingScrollView
android:id="@+id/scrollview_settings"
android:layout_width="match_parent"
android:layout_height="0dp"
android:scrollbars="none"
android:fillViewport="true"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintTop_toBottomOf="@+id/top_layout">
于 2021-08-24T17:15:35.787 回答
0

在我的场景中,当我使用 Padding=10dp 更新滚动视图内的线性布局时,它起作用了。就是这样滚动视图滚动成功

<ScrollView
    android:id="@+id/mainScrollview"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_marginTop="?attr/actionBarSize">


    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/top_layout"
        android:orientation="vertical"
        android:layout_margin="10dp"
        android:padding="10dp">
于 2021-09-15T09:54:17.613 回答