约束布局内的滚动视图不会滚动到父约束的底部

问题描述 投票:0回答:17

我有一个大约有 12/13 个字段的表单。我在约束布局中使用了

Scrollview
。下面是 XML 布局的层次结构。问题是,它不会滚动到底部,而是仅滚动到前 10 个视图。由于视图不再滚动,最后 3 个字段将被隐藏。

家长布局

<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_register"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:focusableInTouchMode="true"
android:orientation="vertical">

<!-- Textview and a button -->

  <ScrollView
    android:id="@+id/scrollView"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:layout_marginBottom="10dp"
    android:layout_marginTop="10dp"
    android:orientation="vertical"
    android:overScrollMode="never"
    android:scrollbars="none"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintRight_toRightOf="parent"
    app:layout_constraintTop_toBottomOf="@+id/view"
    tools:layout_constraintBottom_creator="1"
    tools:layout_constraintLeft_creator="1"
    tools:layout_constraintRight_creator="1"
    tools:layout_constraintTop_creator="1"
    tools:layout_editor_absoluteX="0dp"
    tools:layout_editor_absoluteY="0dp">


  <android.support.constraint.ConstraintLayout
        android:id="@+id/constraintLayout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">

                <!-- Child Views (12/13 views of the fields)-->

  </android.support.constraint.ConstraintLayout>

</ScrollView>

</android.support.constraint.ConstraintLayout>
android android-layout constraints scrollview android-constraintlayout
17个回答
122
投票

此布局适用于我的应用程序。 诀窍是在 ScrollView 中设置这两个属性: 安卓:layout_height =“0dp” 应用程序:layout_constraintBottom_toBottomOf =“父”

我的应用程序的简化布局:

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:theme="@style/ThemeOverlay.AppCompat.Light">

    <RelativeLayout
        android:id="@+id/linear"
        android:layout_width="0dp"
        android:layout_height="56dp"
        android:background="@color/title"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <ScrollView
        android:layout_width="0dp"
        android:layout_height="0dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toBottomOf="@id/linear">

        <android.support.constraint.ConstraintLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content">

            <TextView
                android:id="@+id/titleView"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginLeft="8dp"
                android:layout_marginStart="8dp"
                android:text="@string/title"
                android:textSize="14sp"
                app:layout_constraintBaseline_toBaselineOf="@+id/title"
                app:layout_constraintLeft_toLeftOf="parent" />

            <EditText
                android:id="@+id/title"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_marginEnd="8dp"
                android:layout_marginRight="8dp"
                android:hint="toilet title"
                android:inputType="text"
                android:textColor="@android:color/holo_red_dark"
                android:textSize="12sp"
                app:layout_constraintLeft_toLeftOf="@+id/open_hour"
                app:layout_constraintLeft_toRightOf="@+id/titleView"
                app:layout_constraintRight_toRightOf="parent"
                app:layout_constraintTop_toTopOf="parent" />
            ...
            Other Views in ScrollView
            ...
        </android.support.constraint.ConstraintLayout>
    </ScrollView>
</android.support.constraint.ConstraintLayout>

19
投票

就我而言,

NestedScrollView
代替了
ScrollView
。以下是我的工作布局片段:

<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <!-- Some Views Here -->

    <android.support.v4.widget.NestedScrollView
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:fillViewport="true"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/view">

        <android.support.constraint.ConstraintLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content">

            <!-- Some Views That can be Scrolled Here -->

        </android.support.constraint.ConstraintLayout>

    </android.support.v4.widget.NestedScrollView>

</android.support.constraint.ConstraintLayout>

18
投票

这个问题有两种解决方案(相同的解决方案,但有两种方法):

  1. 如果您将设计模式放入Android Studio中,请选择ScrollView并打开属性选项卡,然后在layout_height中选择“match_constraint”。

  2. 如果您在Android Studio中使用文本模式,请使用:

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

看到ScrollView高度设置为0dp。这两种方法都解决相同的问题,但这是不同的方法。

ScrollView 不是根视图,我有一个像你一样包裹 ScrollView 的约束布局。


13
投票

两步

  1. 将滚动视图的布局高度保持为零

    android:layout_height="0dp"

  2. 再次滚动视图

    android:fillViewport="true"


10
投票

尝试向滚动视图添加底部约束(例如:

app:layout_constraintBottom_toBottomOf="parent"
) 并将 android:layout_height="wrap_content" 更改为
android:layout_height="0dp"


7
投票

就我而言,

NestedScrollView
有效,而不是
ScrollView

以下是我的工作布局的片段: 请确保您没有在 constrianlayout 中为滚动视图设置任何子视图高度来匹配父级(0 dp) android:fillViewport="true;

如有疑问请询问我。

<android.support.v4.widget.NestedScrollView
        android:id="@+id/scroll_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_marginTop="@dimen/_90sdp"
        android:fillViewport="true">

        <android.support.constraint.ConstraintLayout
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:id="@+id/cvLayout"
            android:animateLayoutChanges="true">

4
投票

只需将

android:fillViewport="true"
放入父布局中


1
投票

就我而言,我有一个高的

TextView
(高度设置为
wrap_content
),里面有一个
ScrollView
(高度设置为
0dp
,并且顶部和底部受到限制)。没有任何建议起作用,但我通过将
TextView
包裹在
FrameLayout
内(高度设置为
wrap_content
)解决了问题。


1
投票

如果 ConstraintLayout 的子级位于 SV/NestedSV 内部,切勿保留 0dp 高度

wrap_content
有效,因为在这种情况下 ScrollView 知道它的子级高度。


0
投票

对我来说,我需要在 ScrollView 中添加一个 LinearLayout 来约束它

<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent">


    <ScrollView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:layout_constraintTop_toTopOf="parent"
        tools:layout_editor_absoluteX="1dp">

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

            <View....</View>

        </LinearLayout>

    </ScrollView>


</androidx.constraintlayout.widget.ConstraintLayout>

0
投票

我已经解决了这个问题。在 ScrollView 内部不能使用约束布局。 要在滚动内使用约束,您必须使用相对布局是约束布局的父级..

所以你的顺序应该是:

ScrollView ---> 相对布局 ---> 约束布局


0
投票

如果您在搜索“软键盘隐藏视图元素”后来到这里! 然后你只需要再次添加一个scrollView和相同的布局元素。
之前

<androidx.constraintlayout.widget.ConstraintLayout 
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">

   <ImageView
       android:id="@+id/imageView3"
       android:layout_width="246dp"
       android:layout_height="168dp"
       android:layout_marginTop="20dp"
       android:src="@drawable/img"/>
   <Button
       android:id="@+id/btn"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"/>
</androidx.constraintlayout.widget.ConstraintLayout>


之后

<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">

<ScrollView
    android:layout_width="match_parent"
    android:layout_height="0dp"
    app:layout_constraintTop_toTopOf="parent"
    app:layout_constraintBottom_toBottomOf="parent"
    android:fillViewport="true">

        <androidx.constraintlayout.widget.ConstraintLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent">

            <ImageView
                 android:id="@+id/imageView3"
                 android:layout_width="246dp"
                 android:layout_height="168dp"
                 android:layout_marginTop="20dp"
                 android:src="@drawable/img"/>
            <Button
                 android:id="@+id/btn"
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"/>
        </androidx.constraintlayout.widget.ConstraintLayout>
 </ScrollView>
</androidx.constraintlayout.widget.ConstraintLayout>

0
投票

对于水平滚动视图的情况(父级是 ConstraintLayout,直接子级是 LinearLayout),我发现设置四个约束,layout_width=0dp 和 fillViewport=true 是不够的。还是没有滚动。

在我的例子中有效的是设置四个约束并将元素从 ScrollView 更改为 HorizontalScrollView。在这种情况下,layout_width 可以设置为“wrap_content”,并且 fillViewport 可以省略。 此外,我在 HorizontalScrollView 的直接子级末尾添加了填充,以使滚动体验和外观更好。


0
投票

我遇到了另一个问题,我有

nestedscrollview
,其中有
constrainlayout
,其中有
linearlayout
。这个
linearlayout
有孩子以编程方式添加。所以滚动不起作用。通过
replacing
CL 和 LL 垂直方向

解决
<androidx.core.widget.NestedScrollView
    android:layout_width="match_parent"
    android:layout_height="0dp"
    app:layout_constraintTop_toBottomOf="@+id/separatr"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintBottom_toBottomOf="parent"
    android:fillViewport="true"
    android:fitsSystemWindows="true"
    >

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:fitsSystemWindows="true"
        android:orientation="vertical"
        tools:background="@color/yellow_highlight"
        android:paddingBottom="@dimen/box96">


        <TextView
            android:id="@+id/qansTv"
            style="@style/BodyText"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginStart="@dimen/box200"
            android:layout_marginTop="@dimen/box32"
            android:layout_marginEnd="@dimen/box200"
            android:text="Lorem ipsum dofdfd fsd fdfsd sdf sdfsd fsdfsd fd sdfd fsdfsdf sdfsd df sdfd fsdfsd fsdf sdfsd dflors fdfdf."
            android:textColor="@color/white"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent" />

        <LinearLayout
            android:id="@+id/ansImageContainerLL"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            tools:background="@color/red"
            android:layout_marginEnd="@dimen/box64"
            android:orientation="vertical"
            android:layout_marginStart="@dimen/box64"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/qansTv" />

    </LinearLayout>
</androidx.core.widget.NestedScrollView>

0
投票

在我的例子中,我不得不使用 2 个 recyclerview,因为它不想一直滚动,所以我找到了一种方法来设置滚动视图的滚动长度,长度是通过更改 TextView 的宽度来设置的。

<?xml version="1.0" encoding="utf-8"?>
<HorizontalScrollView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".ui.ProjectsFragment"
android:background="@color/blue">

<FrameLayout
    android:layout_width="wrap_content"
    android:layout_height="match_parent">
    <TextView
        android:id="@+id/scrollViewLength"
        android:layout_width="2000dp"
        android:layout_height="match_parent"
        android:text="Change the width above"
        android:visibility="invisible"/>

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/recyclerView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:tag="exampletag"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/recyclerView1"
        android:tag="exampletag"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_marginTop="28dp"

        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        />
</FrameLayout>

</HorizontalScrollView>

0
投票

我知道我迟到了一点,我遇到了同样的问题,我将 RecyclerView 包裹在线性或相对布局中,它的工作就像一个魅力,


0
投票

就我而言,我需要在 ConstraintLayout 内有一个响应式增长的嵌套 ScrollView。 仅 ScrollView 部分的示例,最大高度为 200dp。 让触摸/拖动在滚动 ConstraintLayout 中工作的技巧是在 ScrollView 子项上启用nestedScrollingEnabled。

    <ScrollView
        android:id="@+id/card_status_holder"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:nestedScrollingEnabled="true"   <----- add this
        app:layout_constrainedHeight="true"
        app:layout_constraintHeight_max="200dp"
        app:layout_constraintTop_toBottomOf="@+id/card_ad_view" >
© www.soinside.com 2019 - 2024. All rights reserved.