自定义Alert Dialog使用Constraint Layout显示异常问题求助
我来帮你分析下这个问题哈~你遇到的情况其实是AlertDialog的布局特性和ConstraintLayout的约束逻辑共同导致的:
AlertDialog的容器默认是wrap_content尺寸,而你的根ConstraintLayout设置了match_parent,但里面所有控件都用0dp(match constraint)依赖百分比Guideline来确定尺寸。问题核心在于:当父布局(AlertDialog容器)没有明确的高度约束时,百分比Guideline没有可参考的基准高度,整个布局的高度会被计算为0,自然所有控件都显示不出来。而当你把某个控件的layout_height改成wrap_content时,这个控件会撑开父布局,给Guideline提供了高度参考,其他依赖Guideline的控件就能正常显示了。
下面给你几个可行的解决方案:
方案一:给根ConstraintLayout设置最小高度
直接给根布局加上android:minHeight属性,让它拥有一个基础高度,这样百分比Guideline就能基于这个高度计算位置了。示例修改:<?xml version="1.0" encoding="utf-8"?> <android.support.constraint.ConstraintLayout 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:layout_width="match_parent" android:layout_height="match_parent" android:minHeight="300dp"> <!-- 添加最小高度约束 --> <!-- 你的Spinner、Guideline、CheckBox等控件代码 --> </android.support.constraint.ConstraintLayout>方案二:将根布局高度改为wrap_content,用固定尺寸控件撑开布局
把根布局的layout_height改成wrap_content,然后给某个核心控件设置固定高度或者wrap_content,其他控件通过约束依赖它,这样整个布局会被这个控件撑开:<?xml version="1.0" encoding="utf-8"?> <android.support.constraint.ConstraintLayout 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:layout_width="match_parent" android:layout_height="wrap_content"> <!-- 修改为wrap_content --> <!-- 给Spinner设置wrap_content高度作为锚点 --> <Spinner android:id="@+id/shapeSpinner" android:layout_width="0dp" android:layout_height="wrap_content" <!-- 改为wrap_content --> android:layout_marginBottom="8dp" android:layout_marginEnd="8dp" android:layout_marginStart="8dp" android:layout_marginTop="8dp" app:layout_constraintBottom_toTopOf="@+id/gH3" app:layout_constraintEnd_toStartOf="@+id/gV2" app:layout_constraintStart_toStartOf="@+id/gV1" app:layout_constraintTop_toTopOf="@+id/gHBreak"> </Spinner> <!-- 你的其他控件代码 --> </android.support.constraint.ConstraintLayout>方案三:替换百分比Guideline为固定距离或控件依赖
如果不想依赖最小高度或wrap_content控件,可以把百分比Guideline换成固定距离的Guideline(比如app:layout_constraintGuide_begin="20dp"),或者让控件直接依赖父布局的上下边缘,这样布局尺寸就能明确计算:<!-- 用固定距离代替百分比Guideline --> <android.support.constraint.Guideline android:id="@+id/gH1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal" app:layout_constraintGuide_begin="30dp" />
另外注意你的XML代码最后一个CheckBox的内容截断了,记得补全哦,不然也可能导致布局解析错误。
内容的提问来源于stack exchange,提问作者Liam G

