ConstraintLayout嵌套ScrollView无法滚动及设置属性后消失的问题
ConstraintLayout下ScrollView无法滚动的问题解决
问题分析
当前布局存在两个核心问题:
- ScrollView使用固定高度
600dp,无法适配不同屏幕尺寸,且内部嵌套的ConstraintLayout设置为match_parent,结合android:fillViewport="true",会让内部布局高度和ScrollView完全一致,当内容总高度未超过ScrollView高度时,自然无法触发滚动。 - 尝试将ScrollView高度设为
0dp并添加app:layout_constraintBottom_toBottomOf="parent"时布局消失,本质是内部ConstraintLayout的高度设置错误,导致ScrollView没有可显示的内容高度。
解决方案
1. 修正ScrollView的布局约束
将ScrollView的高度改为0dp,同时添加底部约束到父布局,确保它占据标题栏下方到屏幕底部的所有空间:
<ScrollView android:layout_width="0dp" android:layout_height="0dp" android:background="@color/light_white" app:layout_constraintRight_toLeftOf="@id/guideline_vertical_right_outside" app:layout_constraintLeft_toRightOf="@id/guideline_vertical_left_outside" app:layout_constraintTop_toBottomOf="@id/dialog_title" app:layout_constraintBottom_toBottomOf="parent" android:fillViewport="true"> <!-- 内部布局 --> </ScrollView>
2. 修改内部ConstraintLayout的高度
将ScrollView内部的ConstraintLayout高度从match_parent改为wrap_content,这样内部布局的高度会根据所有子View的总高度自动计算,当总高度超过ScrollView的可视高度时,就会触发滚动:
<androidx.constraintlayout.widget.ConstraintLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:padding="4dp"> <!-- 内部子View --> </androidx.constraintlayout.widget.ConstraintLayout>
3. 完善内部子View的垂直约束
确保所有垂直方向的子View都形成完整的约束链,比如最后一个static_data_bg的top已约束到static_data的bottom,这样整个内部布局的高度会自动延伸,无需额外设置底部约束。
完整修改后的代码
父布局部分
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent"> <androidx.constraintlayout.widget.Guideline android:id="@+id/guideline_top_in_root_view_layer" android:layout_width="0dp" android:layout_height="0dp" android:orientation="horizontal" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintGuide_percent=".10" /> <TextView android:id="@+id/dialog_title" android:layout_width="0dp" android:layout_height="0dp" android:text="@string/settings_dislpay" android:background="@drawable/shape_sheet_dialog_bg" android:textSize="22sp" android:textColor="@color/black" android:gravity="center" app:layout_constraintRight_toLeftOf="@id/guideline_vertical_right_outside" app:layout_constraintLeft_toRightOf="@id/guideline_vertical_left_outside" app:layout_constraintTop_toBottomOf="@id/guideline_top_in_root_view_layer" app:layout_constraintDimensionRatio="11:1"/> <androidx.constraintlayout.widget.Guideline android:id="@+id/guideline_vertical_left_outside" android:layout_width="0dp" android:layout_height="0dp" android:orientation="vertical" app:layout_constraintGuide_percent="0.01"/> <androidx.constraintlayout.widget.Guideline android:id="@+id/guideline_vertical_right_outside" android:layout_width="0dp" android:layout_height="0dp" android:orientation="vertical" app:layout_constraintGuide_percent="0.56"/> <ScrollView android:layout_width="0dp" android:layout_height="0dp" android:background="@color/light_white" app:layout_constraintRight_toLeftOf="@id/guideline_vertical_right_outside" app:layout_constraintLeft_toRightOf="@id/guideline_vertical_left_outside" app:layout_constraintTop_toBottomOf="@id/dialog_title" app:layout_constraintBottom_toBottomOf="parent" android:fillViewport="true"> <!-- 内部ConstraintLayout --> </ScrollView> </androidx.constraintlayout.widget.ConstraintLayout>
ScrollView内部布局部分
<androidx.constraintlayout.widget.ConstraintLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:padding="4dp"> <androidx.constraintlayout.widget.Guideline android:id="@+id/guideline_vertical_left_item_bg" android:layout_width="0dp" android:layout_height="0dp" android:orientation="vertical" app:layout_constraintGuide_percent="0.025"/> <androidx.constraintlayout.widget.Guideline android:id="@+id/guideline_vertical_right_item_bg" android:layout_width="0dp" android:layout_height="0dp" android:orientation="vertical" app:layout_constraintGuide_percent="0.975"/> <androidx.constraintlayout.widget.Guideline android:id="@+id/guideline_day_night_mode_left" android:layout_width="0dp" android:layout_height="0dp" android:orientation="vertical" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintGuide_percent="0.05"/> <androidx.constraintlayout.widget.Guideline android:id="@+id/guideline_day_night_mode_right" android:layout_width="0dp" android:layout_height="0dp" android:orientation="vertical" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintGuide_percent="0.95"/> <View android:id="@+id/day_night_mode_bg" android:layout_width="0dp" android:layout_height="0dp" android:background="@drawable/display_setting_item_bg" app:layout_constraintRight_toLeftOf="@id/guideline_vertical_right_item_bg" app:layout_constraintLeft_toRightOf="@id/guideline_vertical_left_item_bg" app:layout_constraintTop_toTopOf="parent" app:layout_constraintDimensionRatio="4.5:1"/> <TextView android:id="@+id/display_mode_auto" android:drawableTop="@drawable/ic_launcher" android:layout_width="0dp" android:layout_height="0dp" android:text="Auto" android:textSize="18sp" android:textColor="@color/black" android:gravity="center" app:layout_constraintWidth_percent="0.3" app:layout_constraintLeft_toRightOf="@id/guideline_day_night_mode_left" app:layout_constraintRight_toLeftOf="@id/display_mode_day" app:layout_constraintTop_toTopOf="@id/day_night_mode_bg" app:layout_constraintBottom_toBottomOf="@id/day_night_mode_bg"/> <TextView android:id="@+id/display_mode_day" android:drawableTop="@drawable/ic_launcher" android:layout_width="0dp" android:layout_height="0dp" android:text="Day" android:textSize="20sp" android:textColor="@color/black" android:gravity="center" app:layout_constraintWidth_percent="0.3" app:layout_constraintLeft_toRightOf="@id/display_mode_auto" app:layout_constraintTop_toTopOf="@id/day_night_mode_bg" app:layout_constraintBottom_toBottomOf="@id/day_night_mode_bg"/> <TextView android:id="@+id/display_mode_night" android:drawableTop="@drawable/ic_launcher" android:layout_width="0dp" android:layout_height="0dp" android:text="Night" android:textSize="20sp" android:textColor="@color/black" android:gravity="center" app:layout_constraintWidth_percent="0.3" app:layout_constraintLeft_toRightOf="@id/display_mode_day" app:layout_constraintRight_toLeftOf="@id/guideline_day_night_mode_right" app:layout_constraintTop_toTopOf="@id/day_night_mode_bg" app:layout_constraintBottom_toBottomOf="@id/day_night_mode_bg"/> <TextView android:id="@+id/instant_message" android:layout_width="0dp" android:layout_height="0dp" android:text="instant message" android:textSize="18sp" android:textColor="@color/grey" android:gravity="center_vertical" app:layout_constraintHeight_percent="0.09" app:layout_constraintRight_toLeftOf="@id/guideline_vertical_right_item_bg" app:layout_constraintLeft_toRightOf="@id/guideline_vertical_left_item_bg" app:layout_constraintTop_toBottomOf="@id/day_night_mode_bg"/> <View android:id="@+id/instant_message_bg" android:layout_width="0dp" android:layout_height="0dp" android:background="@drawable/display_setting_item_bg" app:layout_constraintRight_toLeftOf="@id/guideline_vertical_right_item_bg" app:layout_constraintLeft_toRightOf="@id/guideline_vertical_left_item_bg" app:layout_constraintTop_toBottomOf="@id/instant_message" app:layout_constraintDimensionRatio="4.5:1"/> <TextView android:id="@+id/display_tv" android:drawableTop="@drawable/ic_launcher" android:layout_width="0dp" android:layout_height="0dp" android:text="tv" android:textSize="20sp" android:textColor="@color/black" android:gravity="center" app:layout_constraintWidth_percent="0.3" app:layout_constraintLeft_toRightOf="@id/guideline_day_night_mode_left" app:layout_constraintTop_toTopOf="@id/instant_message_bg" app:layout_constraintBottom_toBottomOf="@id/instant_message_bg"/> <TextView android:id="@+id/display_time" android:drawableTop="@drawable/ic_launcher" android:layout_width="0dp" android:layout_height="0dp" android:text="time" android:textSize="20sp" android:textColor="@color/black" android:gravity="center" app:layout_constraintWidth_percent="0.3" app:layout_constraintLeft_toRightOf="@id/display_tv" app:layout_constraintTop_toTopOf="@id/instant_message_bg" app:layout_constraintBottom_toBottomOf="@id/instant_message_bg"/> <TextView android:id="@+id/static_data" android:layout_width="0dp" android:layout_height="0dp" android:text="static data" android:textSize="18sp" android:textColor="@color/grey" android:gravity="center_vertical" app:layout_constraintHeight_percent="0.09" app:layout_constraintRight_toLeftOf="@id/guideline_vertical_right_item_bg" app:layout_constraintLeft_toRightOf="@id/guideline_vertical_left_item_bg" app:layout_constraintTop_toBottomOf="@id/instant_message_bg"/> <View android:id="@+id/static_data_bg" android:layout_width="0dp" android:layout_height="0dp" android:background="@drawable/display_setting_item_bg" app:layout_constraintRight_toLeftOf="@id/guideline_vertical_right_item_bg" app:layout_constraintLeft_toRightOf="@id/guideline_vertical_left_item_bg" app:layout_constraintTop_toBottomOf="@id/static_data" app:layout_constraintDimensionRatio="4.5:1"/> </androidx.constraintlayout.widget.ConstraintLayout>
内容的提问来源于stack exchange,提问作者Joanhahaha
相关产品推荐
相关产品推荐

