ConstraintLayout嵌套在NestedScrollView中无法填充满屏幕,ViewPager2片段不可见
问题原因
NestedScrollView默认测量逻辑下,子控件的match_parent属性会失效,只会按内容高度计算子控件尺寸,所以你给ConstraintLayout设置的高度匹配父布局不生效,最终高度仅能容纳内部的TextView和TabLayout,下方的ViewPager2因为高度为0dp、缺少底部约束的有效高度参考,自然无法渲染内容。
解决方案
给NestedScrollView添加android:fillViewport="true"属性即可,该属性会强制NestedScrollView的子控件填充自身的可视区域,满足你要ConstraintLayout至少占满屏幕高度的需求。
修改后的完整代码如下:
<?xml version="1.0" encoding="utf-8"?> <androidx.core.widget.NestedScrollView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" xmlns:app="http://schemas.android.com/apk/res-auto" <!-- 新增这行属性 --> android:fillViewport="true"> <androidx.constraintlayout.widget.ConstraintLayout android:layout_width="match_parent" android:layout_height="match_parent" android:padding="16dp"> <TextView android:id="@+id/textView" android:layout_width="0dp" android:text="Sample Text" android:layout_height="wrap_content" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toTopOf="parent"/> <com.google.android.material.tabs.TabLayout android:id="@+id/tabLayout" android:layout_width="match_parent" android:layout_height="wrap_content" app:tabGravity="fill" android:layout_marginTop="32dp" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toBottomOf="@id/textView"> <com.google.android.material.tabs.TabItem android:id="@+id/first" android:text="First" android:layout_width="wrap_content" android:layout_height="wrap_content"/> <com.google.android.material.tabs.TabItem android:id="@+id/second" android:text="Second" android:layout_width="wrap_content" android:layout_height="wrap_content"/> <com.google.android.material.tabs.TabItem android:id="@+id/third" android:text="Third" android:layout_width="wrap_content" android:layout_height="wrap_content"/> </com.google.android.material.tabs.TabLayout> <androidx.viewpager2.widget.ViewPager2 android:layout_width="0dp" android:layout_height="0dp" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toBottomOf="@id/tabLayout" app:layout_constraintBottom_toBottomOf="parent"/> </androidx.constraintlayout.widget.ConstraintLayout> </androidx.core.widget.NestedScrollView>
补充说明
添加该属性后,当ConstraintLayout内部的总内容高度超过屏幕高度时,NestedScrollView仍会正常触发滚动,不会影响长内容的展示,同时ViewPager2的高度约束会正常生效,内部Fragment可以正常渲染。
内容的提问来源于stack exchange,提问作者skafle
相关产品推荐
相关产品推荐

