Android ConstraintLayout设wrap_content时DimensionRatio失效求助
解决ConstraintLayout设为wrap_content后正方形TextView不显示的问题
这个问题的核心是循环依赖导致的布局计算死循环:当你把ConstraintLayout的layout_height改成wrap_content后,父布局的高度需要由子TextView来撑起来,但你的两个TextView都设置了layout_height="0dp",同时它们的上下约束都绑定到了父布局的上下两端——这就形成了「父布局等子View给高度,子View等父布局给高度」的死锁,系统无法计算出有效的布局尺寸,所以TextView就完全不显示了。
给你两个可行的解决方案,适配你用的ConstraintLayout 1.1.0版本:
方案一:给TextView添加最小高度基准
给TextView设置android:minHeight,让父布局有明确的高度参考,同时保留正方形比例和链式布局的效果:
<android.support.constraint.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="wrap_content"> <TextView android:id="@+id/textView3" android:layout_width="0dp" android:layout_height="0dp" android:minHeight="120dp" <!-- 添加最小高度,打破循环依赖 --> android:layout_marginStart="8dp" android:layout_marginTop="8dp" android:layout_marginBottom="8dp" android:background="@color/colorBlueGrey" android:text="TextView" app:layout_constraintDimensionRatio="1:1" app:layout_constraintEnd_toStartOf="@+id/textView8" app:layout_constraintHorizontal_chainStyle="packed" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" app:layout_constraintBottom_toBottomOf="parent" /> <TextView android:id="@+id/textView8" android:layout_width="0dp" android:layout_height="0dp" android:minHeight="120dp" android:layout_marginEnd="8dp" android:layout_marginStart="8dp" android:layout_marginTop="8dp" android:layout_marginBottom="8dp" android:background="@color/colorBrown" android:text="TextView" app:layout_constraintDimensionRatio="1:1" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toEndOf="@+id/textView3" app:layout_constraintTop_toTopOf="parent" app:layout_constraintBottom_toBottomOf="parent" /> </android.support.constraint.ConstraintLayout>
方案二:调整约束关系,让高度由宽度驱动
利用constraintDimensionRatio="1:1"的特性,让TextView的高度由横向链式布局分配的宽度决定,同时只让其中一个TextView绑定父布局的底部,撑高整个父布局:
<android.support.constraint.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="wrap_content"> <TextView android:id="@+id/textView3" android:layout_width="0dp" android:layout_height="0dp" android:layout_marginStart="8dp" android:layout_marginTop="8dp" android:layout_marginEnd="8dp" android:background="@color/colorBlueGrey" android:text="TextView" app:layout_constraintDimensionRatio="1:1" app:layout_constraintEnd_toStartOf="@+id/textView8" app:layout_constraintHorizontal_chainStyle="packed" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> <TextView android:id="@+id/textView8" android:layout_width="0dp" android:layout_height="0dp" android:layout_marginTop="8dp" android:layout_marginEnd="8dp" android:layout_marginBottom="8dp" android:background="@color/colorBrown" android:text="TextView" app:layout_constraintDimensionRatio="1:1" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toEndOf="@+id/textView3" app:layout_constraintTop_toTopOf="parent" app:layout_constraintBottom_toBottomOf="parent" /> <!-- 用这个TextView的底部撑高父布局 --> </android.support.constraint.ConstraintLayout>
这个方案的逻辑是:横向链式布局会先给两个TextView分配宽度,然后通过1:1的比例算出高度,最后第二个TextView的底部绑定父布局,让父布局的高度自动适配TextView的高度,彻底打破循环依赖。
另外提一句,如果你能升级ConstraintLayout到2.x版本,这类循环依赖的问题会有更智能的自动处理,但上面的方案在1.1.0版本中可以稳定生效。
内容的提问来源于stack exchange,提问作者Anjula
相关产品推荐
相关产品推荐

