我有一个大约有 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>
此布局适用于我的应用程序。 诀窍是在 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>
就我而言,
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>
这个问题有两种解决方案(相同的解决方案,但有两种方法):
如果您将设计模式放入Android Studio中,请选择ScrollView并打开属性选项卡,然后在layout_height中选择“match_constraint”。
如果您在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 的约束布局。
两步
将滚动视图的布局高度保持为零
android:layout_height="0dp"
再次滚动视图
android:fillViewport="true"
尝试向滚动视图添加底部约束(例如:
app:layout_constraintBottom_toBottomOf="parent"
)
并将 android:layout_height="wrap_content" 更改为 android:layout_height="0dp"
就我而言,
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">
只需将
android:fillViewport="true"
放入父布局中
就我而言,我有一个高的
TextView
(高度设置为wrap_content
),里面有一个ScrollView
(高度设置为0dp
,并且顶部和底部受到限制)。没有任何建议起作用,但我通过将 TextView
包裹在 FrameLayout
内(高度设置为 wrap_content
)解决了问题。
如果 ConstraintLayout 的子级位于 SV/NestedSV 内部,切勿保留 0dp 高度
wrap_content
有效,因为在这种情况下 ScrollView 知道它的子级高度。
对我来说,我需要在 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>
我已经解决了这个问题。在 ScrollView 内部不能使用约束布局。 要在滚动内使用约束,您必须使用相对布局是约束布局的父级..
所以你的顺序应该是:
ScrollView ---> 相对布局 ---> 约束布局
如果您在搜索“软键盘隐藏视图元素”后来到这里!
然后你只需要再次添加一个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>
对于水平滚动视图的情况(父级是 ConstraintLayout,直接子级是 LinearLayout),我发现设置四个约束,layout_width=0dp 和 fillViewport=true 是不够的。还是没有滚动。
在我的例子中有效的是设置四个约束并将元素从 ScrollView 更改为 HorizontalScrollView。在这种情况下,layout_width 可以设置为“wrap_content”,并且 fillViewport 可以省略。 此外,我在 HorizontalScrollView 的直接子级末尾添加了填充,以使滚动体验和外观更好。
我遇到了另一个问题,我有
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>
在我的例子中,我不得不使用 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>
我知道我迟到了一点,我遇到了同样的问题,我将 RecyclerView 包裹在线性或相对布局中,它的工作就像一个魅力,
就我而言,我需要在 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" >