来源:https://developer.android.google.cn/training/constraint-layout?hl=zh-cn#constraints-overview
ConstraintLayout 可让您使用扁平视图层次结构(无嵌套视图组)创建复杂的大型布局。它与 RelativeLayout 相似,其中所有的视图均根据同级视图与父布局之间的关系进行布局,但其灵活性要高于 RelativeLayout,并且更易于与 Android Studio 的布局编辑器配合使用。
ConstraintLayout 的所有功能均可直接通过布局编辑器的可视化工具来使用,因为布局 API 和布局编辑器是专为彼此构建的。 因此,您完全可以使用 ConstraintLayout 通过拖放的形式(而非修改 XML)来构建布局。
本文提供了使用 ConstraintLayout 在 Android Studio 3.0 或更高版本中构建布局的指南。如果您想了解关于布局编辑器的更多信息,请参阅 Android Studio 指南以使用布局编辑器构建界面。
要查看您能够使用 ConstraintLayout 创建的各种布局,请查看 GitHub 上的约束布局示例项目。
约束条件概览
要在 ConstraintLayout 中定义某个视图的位置,您必须为该视图添加至少一个水平约束条件和一个垂直约束条件。每个约束条件均表示与其他视图、父布局或隐形引导线之间连接或对齐方式。每个约束条件均定义了视图在竖轴或者横轴上的位置;因此每个视图在每个轴上都必须至少有一个约束条件,但通常情况下会需要更多约束条件。
当您将视图拖放到布局编辑器中时,即使没有任何约束条件,它也会停留在您放置的位置。不过,这只是为了便于修改;当您在设备上运行布局时,如果视图没有任何约束条件,则会在位置 [0,0](左上角)处进行绘制。
在图 1 中,布局在编辑器中看起来很完美,但视图 C 上却没有垂直约束条件。在设备上绘制此布局时,虽然视图 C 与视图 A 的左右边缘水平对齐,但由于没有垂直约束条件,它会显示在屏幕顶部。
图 1. 编辑器将视图 C 显示在视图 A 下方,但它并没有垂直约束条件
图 2. 视图 C 现垂直约束在视图 A 下方
尽管缺少约束条件不会导致出现编译错误,但布局编辑器会将缺少约束条件作为错误显示在工具栏中。要查看错误和其他警告,请点击 Show Warnings and Errors。 为帮助您避免出现缺少约束条件这一问题,布局编辑器会使用 Autoconnect 和 Infer Constraints 功能自动为您添加约束条件。
将 ConstraintLayout 添加到项目中
如需在项目中使用 ConstraintLayout,请按以下步骤操作:
确保您的 maven.google.com 代码库已在模块级 build.gradle 文件中声明:
repositories {
google()
}
将该库作为依赖项添加到同一个 build.gradle 文件中,如以下示例所示。请注意,最新版本可能与示例中显示的不同:
dependencies {
implementation “androidx.constraintlayout:constraintlayout:2.2.0-alpha07”
// To use constraintlayout in compose
implementation “androidx.constraintlayout:constraintlayout-compose:1.1.0-alpha07”
}
在工具栏或同步通知中,点击 Sync Project with Gradle Files。
现在,您可以使用 ConstraintLayout 构建布局。
转换布局
如需将现有布局转换为约束布局,请按以下步骤操作:
在 Android Studio 中打开您的布局,然后点击编辑器窗口底部的 Design 标签页。
在 Component Tree 窗口中,右键点击该布局,然后点击 Convert layout to ConstraintLayout。
创建新布局
如需开始新的约束布局文件,请按以下步骤操作:
在 Project 窗口中,点击模块文件夹,然后依次选择 File > New > XML > Layout XML。
输入该布局文件的名称,并对 Root Tag 输入“androidx.constraintlayout.widget.ConstraintLayout”。
点击 Finish。
图 3. 用于将布局转换为 ConstraintLayout 的菜单
添加或移除约束条件
视频 1. 视图的左侧被约束在父布局的左侧
如需添加约束条件,请执行以下操作:
- 将视图从 Palette 窗口拖到编辑器中。当您在
ConstraintLayout
中添加视图时,该视图会显示一个边界框,每个角都有用于调整大小的方形手柄,每条边上都有圆形的约束手柄。 - 点击视图将其选中。
- 执行以下任一操作:
- 点击约束手柄并将其拖动到可用定位点。 此点可以是另一视图的边缘、布局的边缘或者引导线。请注意,当您拖动约束手柄时,布局编辑器会显示可行的连接定位点和蓝色叠加层。
- 点击 Attributes 窗口的 Layout 部分中的 Create a connection 按钮 ,具体如图 4 所示。
图 4. 您可以通过 Attributes 窗口中的 Layout 部分创建连接。
创建约束条件后,编辑器会为其指定默认外边距来分隔两个视图。
创建约束条件时,请注意以下规则:
- 每个视图都必须至少有两个约束条件:一个水平约束条件,一个垂直约束条件。
- 您只能在共用同一平面的约束手柄与定位点之间创建约束条件。因此,视图的垂直平面(左侧和右侧)只能约束在另一个垂直平面上;而基准线则只能约束到其他基准线上。
- 每个约束句柄只能用于一个约束条件,但您可以在同一定位点上创建多个约束条件(从不同的视图)。
您可以通过执行以下任一操作来删除约束条件:
- 点击某个约束条件将其选中,然后按
Delete
。 - 按住
Control
(在 macOS 上为Command
),然后点击某个约束定位点。请注意,该约束条件变为红色即表示您可以点击将其删除,如图 5 所示。
图 5. 红色约束条件表示您可以点击将其删除。
- 在 Attributes 窗口的 Layout 部分中,点击某个约束定位点,如图 6 所示。
图 6. 点击约束定位点将其删除。