ConstraintLayout 内的 NestedScrollView 不可滚动

Posted

技术标签:

【中文标题】ConstraintLayout 内的 NestedScrollView 不可滚动【英文标题】:NestedScrollView inside ConstraintLayout not scrollable 【发布时间】:2022-01-02 16:13:08 【问题描述】:

我有一个ConstraintLayout,里面还有几个其他部分也是ConstraintLayouts。最后在底部我有两个RecyclerViews 和一对按钮。我的目标是让layout_2 下方的屏幕部分可滚动——这样就包括两个RecyclerViews 和几个附带的标签。然后这两个按钮必须始终可见。

代码:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_
    android:layout_
    xmlns:tools="http://schemas.android.com/tools"
    android:background="@color/picker_performance_grey"
    android:padding="20dp">

    <androidx.constraintlayout.widget.ConstraintLayout
        android:id="@+id/layout_1"
        android:layout_
        android:layout_
        android:layout_marginTop="10dp"
        android:background="@color/colorWhite"
        android:padding="10dp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent">

        <!--        some widgets-->

    </androidx.constraintlayout.widget.ConstraintLayout>

    <androidx.constraintlayout.widget.ConstraintLayout
        android:id="@+id/layout_2"
        android:layout_
        android:layout_
        android:layout_marginTop="10dp"
        android:background="@color/colorWhite"
        android:padding="10dp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@id/layout_1">

        <!--        some widgets-->

    </androidx.constraintlayout.widget.ConstraintLayout>

    <androidx.core.widget.NestedScrollView
        android:layout_
        android:layout_
        android:fillViewport="true"
        app:layout_constraintTop_toBottomOf="@id/layout_2"
        app:layout_constraintStart_toStartOf="parent">

        <LinearLayout
            android:layout_
            android:layout_
            android:orientation="vertical">

            <!--            some widgets-->

            <androidx.recyclerview.widget.RecyclerView
                android:id="@+id/rv_pick"
                android:layout_
                android:layout_
                android:layout_marginTop="10dp"
                tools:listitem="@layout/inbound_item_detail_sector"
                tools:visibility="visible" />

            <!--            some widgets-->

            <androidx.recyclerview.widget.RecyclerView
                android:id="@+id/rv_buffer"
                android:layout_
                android:layout_
                android:layout_marginTop="10dp"
                tools:listitem="@layout/inbound_item_detail_sector"
                tools:visibility="gone" />

        </LinearLayout>

    </androidx.core.widget.NestedScrollView>

    <LinearLayout
        android:layout_
        android:layout_
        android:orientation="horizontal"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent">

        <Button
            android:id="@+id/btn_1"
            style="@style/button_bordered"
            android:layout_
            android:layout_
            android:layout_marginHorizontal="5dp"
            android:layout_weight="50" />

        <Button
            android:id="@+id/btn_2"
            style="@style/button_bordered"
            android:layout_
            android:layout_
            android:layout_marginHorizontal="5dp"
            android:layout_weight="50"
            android:text="@string/product_detail_btn_finish" />

    </LinearLayout>
    
</androidx.constraintlayout.widget.ConstraintLayout>

但是,滚动不起作用。我做错了什么?

【问题讨论】:

【参考方案1】:

尝试在 recyclerview for ex 中停止 nestedScrolling

 <androidx.recyclerview.widget.RecyclerView
                android:id="@+id/rv_pick"
                android:layout_
                android:layout_
                android:layout_marginTop="10dp"
                android:nestedScrollingEnabled="false"
                tools:listitem="@layout/inbound_item_detail_sector"
                tools:visibility="visible" />

或来自代码rv_pick.setNestedScrollingEnabled(false);

如果只出现一个回收器而另一个将消失,我建议在 XML 中只使用一个并通过更改适配器从 java 代码控制它

【讨论】:

试过了,可惜没用。

以上是关于ConstraintLayout 内的 NestedScrollView 不可滚动的主要内容,如果未能解决你的问题,请参考以下文章

Android - ConstraintLayout 内的 TextView 向右无限远 - 如何使用 ImageView 固定并有省略号

为约束布局内的布局设置最小百分比高度

将两个项目限制在线性布局内的顶部和底部

SELECT DISTINCT 返回所有值

android.view.InflateException:膨胀类 androidx.constraintlayout.widget.ConstraintLayout 时出错

ConstraintLayout系列:ConstraintLayout实现局部垂直居中