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

时间:2017-02-25 07:43:49

标签: android android-layout constraints scrollview android-constraintlayout

我的表格大约有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>

14 个答案:

答案 0 :(得分:39)

此布局适用于我的应用。 诀窍是在ScrollView中设置这两个属性: 机器人:layout_height =&#34; 0dp&#34; 应用程式:layout_constraintBottom_toBottomOf =&#34;父&#34;

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

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

答案 1 :(得分:7)

两步

  1. 保持滚动视图的布局高度为零 android:layout_height="0dp"

  2. 再次滚动视图
    android:fillViewport="true"

答案 2 :(得分:6)

尝试向scrollview添加底部约束(例如:app:layout_constraintBottom_toBottomOf="parent") 并更改android:layout_height =&#34; wrap_content&#34;到android:layout_height="0dp"

答案 3 :(得分:5)

在我的情况下,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>

答案 4 :(得分:3)

在我看来,NestedScrollView代替了ScrollView

以下是我的工作布局摘要: 请确保滚动视图 android:fillViewport =“ true ;

都没有使子视图高度与constrianlayout中的parent(0 dp)相匹配。

如有疑问,请问我。

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

答案 5 :(得分:2)

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

  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">
    
  3. 看到ScrollView高度设置为0dp。这两种方法都解决了同样的问题,但这些是不同的方法。

    ScrollView不是根视图,我有一个Constraint布局包装ScrollView就像你一样。

答案 6 :(得分:2)

只需将android:fillViewport="true"放在父版式中

答案 7 :(得分:0)

在我的情况下,我在TextView(高度设置为wrap_content)内有一个高ScrollView(高度设置为0dp),并且在顶部和底部受到约束)。没有任何建议有效,但是我通过将TextView包装在FrameLayout(高度设置为wrap_content)中解决了这个问题。

答案 8 :(得分: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>

答案 9 :(得分:0)

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

您的顺序应为:

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

答案 10 :(得分: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>

答案 11 :(得分:0)

如果 ConstraintLayout 位于 SV/NestedSV 内部,则永远不要保持其子节点的 0dp 高度

wrap_content 之所以有效,是因为在这种情况下 ScrollView 知道其孩子的身高。

答案 12 :(得分:0)

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

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

答案 13 :(得分:0)

我遇到了另一个问题,我有 nestedscrollviewconstrainlayoutlinearlayout。此 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>