使用layout_constraintGuide_percent出现空锚点崩溃的横向约束要求
崩溃根本原因
app:layout_constraintGuide_percent 是仅适用于 Guideline 辅助线控件的专属属性,不能直接添加到普通自定义View/系统View上。ConstraintLayout解析该属性时会默认当前控件为Guideline,尝试读取其不存在的锚点配置,因此会在横向计算阶段抛出空锚点异常,和你设置的其他横向约束没有关联。
需求实现方案
如果你是要实现第一个TextInputView宽度占父布局45%的效果,有两种合规实现方式:
方案1:配合Guideline使用百分比属性
先在布局中新增垂直方向的Guideline,设置百分比属性,再将两个控件的对应锚点约束到Guideline即可:
<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"> <!-- 新增45%位置的垂直辅助线 --> <androidx.constraintlayout.widget.Guideline android:id="@+id/guide_45" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="vertical" app:layout_constraintGuide_percent="0.45" /> <com.custom.TextInputView android:id="@+id/a" android:layout_width="0dp" android:layout_height="wrap_content" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="@id/guide_45" app:layout_constraintTop_toBottomOf="@id/c_notshown_in_example" /> <com.custom.TextInputView android:id="@+id/b" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="@dimen/u2" android:layout_marginEnd="@dimen/u2" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="@id/guide_45" app:layout_constraintTop_toTopOf="@id/a" /> </androidx.constraintlayout.widget.ConstraintLayout>
方案2:使用普通View的宽度百分比属性
直接给第一个控件使用适用于普通View的layout_constraintWidth_percent属性即可,无需新增Guideline:
<com.custom.TextInputView android:id="@+id/a" android:layout_width="0dp" android:layout_height="wrap_content" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toStartOf="@+id/b" app:layout_constraintTop_toBottomOf="@id/c_notshown_in_example" app:layout_constraintWidth_percent="0.45" />
百分比属性横向约束要求
使用layout_constraintGuide_percent时必须满足以下条件:
- 必须为Guideline明确指定
android:orientation="vertical"属性,垂直方向的Guideline才会对应横向的百分比位置 - 同一个Guideline不能同时设置
layout_constraintGuide_begin、layout_constraintGuide_end、layout_constraintGuide_percent中的任意两个属性,只能保留其中一个 - 只能用垂直方向的Guideline约束普通View的start、end等横向锚点,不能用水平Guideline约束横向锚点
内容的提问来源于stack exchange,提问作者Nick Cardoso
相关产品推荐
相关产品推荐

