升级ConstraintLayout至1.1.0后仅显示白色背景的UI问题求助
问题排查与解决方案
从你描述的问题和提供的XML代码来看,升级到ConstraintLayout 1.1.0后布局仅显示CardView轮廓的核心原因是约束设置错误导致子视图被挤出屏幕,再加上1.1.0版本对约束完整性的校验更严格,和1.0.2的兼容逻辑不同,才出现了内容消失的情况。
具体问题点分析
看你布局里的两个核心视图:
imageViewPropertyType设置了app:layout_constraintLeft_toRightOf="parent"—— 这个约束会让ImageView的左边缘对齐父布局的右边缘,直接把整个视图推到了CardView的外部区域,自然看不到内容。textViewTitle同样设置了app:layout_constraintLeft_toRightOf="parent",也会被挤出屏幕。
早期的ConstraintLayout 1.0.2可能对这类不严谨的约束有“容错”处理,自动调整了视图位置,但1.1.0版本强化了约束的准确性,严格按照你设置的规则布局,就出现了内容消失的问题。
修复步骤
修改这两个视图的约束,把它们调整到CardView内部可见区域,同时优化部分布局细节:
修复后的完整XML代码
<android.support.v7.widget.CardView 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/mCardviewPropertytype" android:layout_width="160dp" tools:background="@color/gray_black" android:layout_height="180dp" android:layout_margin="8dp" app:cardCornerRadius="8dp" app:cardElevation="2dp"> <android.support.constraint.ConstraintLayout android:layout_width="match_parent" android:layout_height="match_parent" android:layout_gravity="center" android:layout_margin="8dp"> <android.support.constraint.ConstraintLayout android:id="@+id/ImgPropertySelect" android:layout_width="40dp" android:layout_height="40dp" android:background="@drawable/half_circle" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent"> <ImageView tools:visibility="visible" android:layout_marginLeft="10dp" android:layout_marginBottom="10dp" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent" app:layout_constraintBottom_toBottomOf="parent" android:layout_width="20dp" android:layout_height="20dp" android:layout_centerInParent="true" app:srcCompat="@drawable/ic_done_white_" /> </android.support.constraint.ConstraintLayout> <android.support.constraint.Guideline android:id="@+id/guideline" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal" app:layout_constraintGuide_percent="0.5" /> <ImageView tools:visibility="visible" android:id="@+id/imageViewPropertyType" android:layout_width="80dp" android:layout_height="80dp" android:src="@drawable/residential_villa_img" android:layout_marginLeft="16dp" app:layout_constraintBottom_toTopOf="@+id/guideline" app:layout_constraintLeft_toLeftOf="parent" /> <TextView tools:text="@string/nearResidentialArea" android:id="@+id/textViewTitle" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="16dp" android:layout_marginTop="16dp" android:text="TextView" android:textColor="@color/gray_black" android:textSize="20sp" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintTop_toBottomOf="@+id/guideline" /> </android.support.constraint.ConstraintLayout> </android.support.v7.widget.CardView>
关键修改说明
- 把外层子ConstraintLayout的宽高从固定
160dp/180dp改成match_parent,避免和CardView的尺寸冲突,保证布局填充整个CardView。 - 将
imageViewPropertyType和textViewTitle的app:layout_constraintLeft_toRightOf="parent"改为app:layout_constraintLeft_toLeftOf="parent",让它们的左边缘对齐父布局的左边缘,回到可见区域内。 - 把TextView的
textSize单位从dp改成sp(这是Android字体大小的标准单位,能更好适配不同设备的字体缩放设置)。
额外建议
升级ConstraintLayout版本后,建议开启Android Studio的ConstraintLayout Inspector工具,实时查看视图的约束和位置,能快速定位这类布局偏移问题。
内容的提问来源于stack exchange,提问作者Libin Thomas
相关产品推荐
相关产品推荐

