NestedScrollView/ ScrollView 在某些布局包含到 ScrollView 的子项时不滚动

Posted

技术标签:

【中文标题】NestedScrollView/ ScrollView 在某些布局包含到 ScrollView 的子项时不滚动【英文标题】:NestedScrollView/ ScrollView is not scrolling when some layout are included to the child of ScrollView 【发布时间】:2020-07-07 06:36:55 【问题描述】:
androidx.core.widget.NestedScrollView
LinearLayout
androidx.constraintlayout.widget.ConstraintLayout
TextView
CheckBox
CheckBox
CheckBox
CheckBox
CheckBox
CheckBox
CheckBox
CheckBox
CheckBox
CheckBox
TextView
include
include
include

上面是我的 XML 的结构,当我包含布局时,滚动视图不起作用。

最初包含的布局是 Visibility GONE 并且它们在选中复选框时可见。 复选框不足以使屏幕可滚动,但一旦包含的布局可见,scrollView 应该滚动。但是布局在底部剪切并且不滚动。

完整的 XML:

<?xml version="1.0" encoding="utf-8"?>

<data>

    <variable
        name="annualRiskAssessmentVM"
        type="com.cmm_android.forms.risk_assessment.AnnualRiskAssessmentVM" />

    <variable
        name="fragment"
        type="com.cmm_android.forms.risk_assessment.AnnualRiskAssessmentFrag4" />

</data>


<androidx.core.widget.NestedScrollView
    android:layout_
    android:layout_
    android:fillViewport="true">

    <LinearLayout
        android:layout_
        android:layout_>

        <androidx.constraintlayout.widget.ConstraintLayout
            android:layout_
            android:layout_
            android:padding="@dimen/_16sdp">


            <TextView
                android:id="@+id/tv2"
                style="@style/RegularBlack"
                android:layout_
                android:layout_
                android:layout_marginTop="@dimen/_8sdp"
                android:text="My support will include assistance with :"
                android:textAlignment="viewStart"
                app:layout_constraintTop_toBottomOf="@+id/tv1" />

            <CheckBox
                android:id="@+id/cbMedication"
                style="@style/CheckBox"
                android:layout_
                android:layout_
                android:layout_marginTop="@dimen/_8sdp"
                android:text="Medication"
                app:layout_constraintTop_toBottomOf="@id/tv2" />

            <CheckBox
                android:id="@+id/cbPersonalCare"
                style="@style/CheckBox"
                android:layout_
                android:layout_
                android:layout_marginTop="@dimen/_4sdp"
                android:text="Personal Care"
                app:layout_constraintTop_toBottomOf="@id/cbMedication" />

            <CheckBox
                android:id="@+id/cbNutrition"
                style="@style/CheckBox"
                android:layout_
                android:layout_
                android:layout_marginTop="@dimen/_4sdp"
                android:text="Nutrition"
                app:layout_constraintTop_toBottomOf="@id/cbPersonalCare" />

            <CheckBox
                android:id="@+id/cbMoneyManagement"
                style="@style/CheckBox"
                android:layout_
                android:layout_
                android:layout_marginTop="@dimen/_4sdp"
                android:text="Money Management"
                app:layout_constraintTop_toBottomOf="@id/cbNutrition" />

            <CheckBox
                android:id="@+id/cbShopping"
                style="@style/CheckBox"
                android:layout_
                android:layout_
                android:layout_marginTop="@dimen/_4sdp"
                android:text="Shopping"
                app:layout_constraintTop_toBottomOf="@id/cbMoneyManagement" />

            <CheckBox
                android:id="@+id/cbSocialActivity"
                style="@style/CheckBox"
                android:layout_
                android:layout_
                android:layout_marginTop="@dimen/_4sdp"
                android:text="Social activities or accessing the community"
                app:layout_constraintTop_toBottomOf="@id/cbShopping" />

            <CheckBox
                android:id="@+id/cbCompanionship"
                style="@style/CheckBox"
                android:layout_
                android:layout_
                android:layout_marginTop="@dimen/_4sdp"
                android:text="Companionship (sitter service)"
                app:layout_constraintTop_toBottomOf="@id/cbSocialActivity" />

            <CheckBox
                android:id="@+id/cbWellbeing"
                style="@style/CheckBox"
                android:layout_
                android:layout_
                android:layout_marginTop="@dimen/_4sdp"
                android:text="Wellbeing checks"
                app:layout_constraintTop_toBottomOf="@id/cbCompanionship" />

            <CheckBox
                android:id="@+id/cbDomestic"
                style="@style/CheckBox"
                android:layout_
                android:layout_
                android:layout_marginTop="@dimen/_4sdp"
                android:text="Domestic"
                app:layout_constraintTop_toBottomOf="@id/cbWellbeing" />

            <CheckBox
                android:id="@+id/cbOther"
                style="@style/CheckBox"
                android:layout_
                android:layout_
                android:layout_marginTop="@dimen/_4sdp"
                android:text="Other"
                app:layout_constraintTop_toBottomOf="@id/cbDomestic" />


            <TextView
                android:id="@+id/tv3"
                style="@style/SmallBlack"
                android:layout_
                android:layout_
                android:layout_marginTop="@dimen/_8sdp"
                android:text="Now complete additional relevant sections below"
                app:layout_constraintTop_toBottomOf="@id/cbOther" />


            <include
                android:id="@+id/layout_medication"
                layout="@layout/layout_medication"
                android:layout_
                android:layout_
                android:visibility="gone"
                app:layout_constraintEnd_toEndOf="parent"
                app:layout_constraintStart_toStartOf="parent"
                app:layout_constraintTop_toBottomOf="@+id/tv3" />

            <include
                android:id="@+id/layout_personal_care"
                layout="@layout/layout_personal_care"
                android:layout_
                android:layout_
                android:visibility="gone"
                app:layout_constraintEnd_toEndOf="parent"
                app:layout_constraintStart_toStartOf="parent"
                app:layout_constraintTop_toBottomOf="@+id/layout_medication" />

            <include
                android:id="@+id/layout_nutrition"
                layout="@layout/layout_nutrition"
                android:layout_
                android:layout_
                android:visibility="gone"
                app:layout_constraintEnd_toEndOf="parent"
                app:layout_constraintStart_toStartOf="parent"
                app:layout_constraintTop_toBottomOf="@+id/layout_personal_care" />


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

我浏览了许多关于 SO 的帖子,但没有一篇与包含布局的可见性有关。

【问题讨论】:

【参考方案1】:

所以,这是我花了一整天才弄明白的最愚蠢的错误。

我的约束布局的第一个孩子被限制在 tv1 的底部,它甚至不存在于整个布局中。 (复制粘贴错误)

    <TextView
            android:id="@+id/tv2"
            style="@style/RegularBlack"
            android:layout_
            android:layout_
            android:layout_marginTop="@dimen/_8sdp"
            android:text="My support will include assistance with :"
            android:textAlignment="viewStart"
            app:layout_constraintTop_toBottomOf="@+id/tv1" />

改成

 app:layout_constraintTop_toTopOf="parent" 

滚动开始工作。 :)

【讨论】:

以上是关于NestedScrollView/ ScrollView 在某些布局包含到 ScrollView 的子项时不滚动的主要内容,如果未能解决你的问题,请参考以下文章

当在nestedscrollview的recyclerview中将项目拖出可见空间时-nestedscrollView不滚动

有关NestedScrollView的问题

检查 NestedScrollView 是不是可滚动

从 NestedScrollView 中删除 OnScrollChangeListener

Android之解决NestedScrollView嵌套RecyclerView部分手机返回到这个页面Recyclerview顶部,而不是页面NestedScrollView顶部

Android之解决NestedScrollView嵌套RecyclerView部分手机返回到这个页面Recyclerview顶部,而不是页面NestedScrollView顶部