Android ConstraintLayout 中心与多个按钮水平对齐

Android ConstraintLayout Center Aligning Horizontally With Multiple Buttons

我最近开始在 android studio 中使用 ConstraintLayout(稍后可能会在我的应用程序中使用它),我想创建一个布局,其中一行有 5 个按钮,并且有 10 行,每行 5 个按钮。我做对了,除了我希望所有按钮都调整到相同的宽度,同时填充整行(按钮之间没有间隙)。

A example of the problem:

我现在的 xml:

<?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"
    tools:context="lotterynumbergenerator.johnferrazlopez.com.southafricanlotteryguide.other.SaveNumbers">

    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="01"
        android:textStyle="bold"
        app:layout_constraintHorizontal_chainStyle="spread_inside"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toLeftOf="@+id/button2"
        tools:layout_editor_absoluteY="16dp" />

    <Button
        android:id="@+id/button2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="02"
        android:textStyle="bold"
        app:layout_constraintLeft_toRightOf="@+id/button"
        app:layout_constraintRight_toLeftOf="@+id/button3"
        tools:layout_editor_absoluteY="16dp" />

    <Button
        android:id="@+id/button3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="03"
        android:textStyle="bold"
        app:layout_constraintLeft_toRightOf="@+id/button2"
        app:layout_constraintRight_toLeftOf="@+id/button4"
        tools:layout_editor_absoluteY="16dp" />

    <Button
        android:id="@+id/button4"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="04"
        android:textStyle="bold"
        app:layout_constraintLeft_toRightOf="@+id/button3"
        app:layout_constraintRight_toLeftOf="@+id/button5"
        tools:layout_editor_absoluteY="16dp" />

    <Button
        android:id="@+id/button5"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="05"
        android:textStyle="bold"
        app:layout_constraintLeft_toRightOf="@+id/button4"
        app:layout_constraintRight_toRightOf="parent"
        tools:layout_editor_absoluteY="16dp" />

    <Button
        android:id="@+id/button6"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="06"
        tools:layout_editor_absoluteY="64dp"
        app:layout_constraintRight_toLeftOf="@+id/button7"
        app:layout_constraintLeft_toLeftOf="parent" />

    <Button
        android:id="@+id/button7"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="07"
        tools:layout_editor_absoluteY="64dp"
        app:layout_constraintRight_toLeftOf="@+id/button8"
        app:layout_constraintLeft_toRightOf="@+id/button6" />

    <Button
        android:id="@+id/button8"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="08"
        tools:layout_editor_absoluteY="64dp"
        app:layout_constraintRight_toLeftOf="@+id/button9"
        app:layout_constraintLeft_toRightOf="@+id/button7" />

    <Button
        android:id="@+id/button9"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="09"
        tools:layout_editor_absoluteY="64dp"
        app:layout_constraintRight_toLeftOf="@+id/button10"
        app:layout_constraintLeft_toRightOf="@+id/button8" />

    <Button
        android:id="@+id/button10"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="10"
        tools:layout_editor_absoluteY="64dp"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintLeft_toRightOf="@+id/button9" />
</android.support.constraint.ConstraintLayout>

我在 xml 中看到的另一件事是标签中的这条消息是 "This view is not constrained vertically: at runtime it will jump to the left unless you add a vertical constraint"

提前致谢。

编辑:

这是您使用 10dp 作为页边距查找的示例。我只创建了一行,但其他行将遵循相同的模式。此模型使用水平链条,链条样式为 "spread"。 (app:layout_constraintHorizontal_chainStyle="spread") 按钮的宽度设置为“0dp”("match constraints")。开始和结束边距负责确保间距正确。该布局适用于纵向和横向以及不同的屏幕尺寸。

添加将每个按钮绑定到父顶部的约束会处理 "not vertically constrained" 错误消息。视图必须在水平和垂直方向上受到约束。

纵向

横向

和 XML:

<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"
    tools:layout_editor_absoluteX="0dp"
    tools:layout_editor_absoluteY="25dp">

    <Button
        android:id="@+id/button"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginEnd="10dp"
        android:layout_marginStart="10dp"
        android:layout_marginTop="8dp"
        android:text="01"
        android:textStyle="bold"
        app:layout_constraintEnd_toStartOf="@+id/button2"
        app:layout_constraintHorizontal_bias="0.5"
        app:layout_constraintHorizontal_chainStyle="spread"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <Button
        android:id="@+id/button2"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginEnd="10dp"
        android:layout_marginTop="8dp"
        android:text="02"
        android:textStyle="bold"
        app:layout_constraintEnd_toStartOf="@+id/button3"
        app:layout_constraintHorizontal_bias="0.5"
        app:layout_constraintStart_toEndOf="@+id/button"
        app:layout_constraintTop_toTopOf="parent" />

    <Button
        android:id="@+id/button3"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginEnd="10dp"
        android:layout_marginTop="8dp"
        android:text="03"
        android:textStyle="bold"
        app:layout_constraintEnd_toStartOf="@+id/button4"
        app:layout_constraintHorizontal_bias="0.5"
        app:layout_constraintStart_toEndOf="@+id/button2"
        app:layout_constraintTop_toTopOf="parent" />

    <Button
        android:id="@+id/button4"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginEnd="10dp"
        android:layout_marginTop="8dp"
        android:text="04"
        android:textStyle="bold"
        app:layout_constraintEnd_toStartOf="@+id/button5"
        app:layout_constraintHorizontal_bias="0.5"
        app:layout_constraintStart_toEndOf="@+id/button3"
        app:layout_constraintTop_toTopOf="parent" />

    <Button
        android:id="@+id/button5"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginEnd="10dp"
        android:layout_marginTop="8dp"
        android:text="05"
        android:textStyle="bold"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.5"
        app:layout_constraintStart_toEndOf="@+id/button4"
        app:layout_constraintTop_toTopOf="parent" />

</android.support.constraint.ConstraintLayout>

如果您 link 将每行的所有第一个按钮放入垂直链中,您将摆脱错误消息,并且行的高度也会自动调整大小。尝试 0dp40dp@dimen/buttonHeight 等固定值来优化按钮的高度。

基于您的代码和 Cheticamp 的代码,您可以执行以下操作:

    <Button
    android:id="@+id/button"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:layout_marginEnd="5dp"
    android:layout_marginStart="10dp"
    android:layout_marginTop="8dp"
    android:layout_marginBottom="5dp"
    android:text="01"
    android:textStyle="bold"
    app:layout_constraintEnd_toStartOf="@+id/button2"
    app:layout_constraintHorizontal_chainStyle="spread"
    app:layout_constraintVertical_chainStyle="spread"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent" 
    app:layout_constraintBottom_toTopOf="@+id/button6"
    />

<Button
    android:id="@+id/button2"
    android:layout_width="0dp"
    android:layout_height="0dp"
    android:layout_marginEnd="5dp"
    android:layout_marginStart="5dp"
    android:text="02"
    android:textStyle="bold"
    app:layout_constraintStart_toEndOf="@+id/button"
    app:layout_constraintEnd_toStartOf="@+id/button3"
    app:layout_constraintTop_toTopOf="@+id/button"
    app:layout_constraintBottom_toBottomOf="@+id/button"
    />

<Button
    android:id="@+id/button3"
    android:layout_width="0dp"
    android:layout_height="0dp"
    android:layout_marginEnd="5dp"
    android:layout_marginStart="5dp"
    android:text="03"
    android:textStyle="bold"
    app:layout_constraintStart_toEndOf="@+id/button2"
    app:layout_constraintEnd_toStartOf="@+id/button4"
    app:layout_constraintTop_toTopOf="@+id/button"
    app:layout_constraintBottom_toBottomOf="@+id/button"
    />

<Button
    android:id="@+id/button4"
    android:layout_width="0dp"
    android:layout_height="0dp"
    android:layout_marginEnd="5dp"
    android:layout_marginStart="5dp"
    android:text="04"
    android:textStyle="bold"
    app:layout_constraintStart_toEndOf="@+id/button3"
    app:layout_constraintEnd_toStartOf="@+id/button5"
    app:layout_constraintTop_toTopOf="@+id/button"
    app:layout_constraintBottom_toBottomOf="@+id/button"
    />

<Button
    android:id="@+id/button5"
    android:layout_width="0dp"
    android:layout_height="0dp"
    android:layout_marginEnd="10dp"
    android:layout_marginStart="5dp"
    android:text="05"
    android:textStyle="bold"
    app:layout_constraintStart_toEndOf="@+id/button4"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintTop_toTopOf="@+id/button"
    app:layout_constraintBottom_toBottomOf="@+id/button"
    />

<Button
    android:id="@+id/button6"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:layout_marginEnd="5dp"
    android:layout_marginStart="10dp"
    android:layout_marginTop="5dp"
    android:layout_marginBottom="5dp"
    android:text="06"
    android:textStyle="bold"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintEnd_toStartOf="@+id/button7"
    app:layout_constraintTop_toBottomOf="@+id/button" 
    app:layout_constraintBottom_toTopOf="@+id/button11"
    />

<Button
    android:id="@+id/button7"
    android:layout_width="0dp"
    android:layout_height="0dp"
    android:layout_marginEnd="5dp"
    android:layout_marginStart="5dp"
    android:text="07"
    android:textStyle="bold"
    app:layout_constraintStart_toEndOf="@+id/button6"
    app:layout_constraintEnd_toStartOf="@+id/button8"
    app:layout_constraintTop_toTopOf="@+id/button6"
    app:layout_constraintBottom_toBottomOf="@+id/button6"
    />

<Button
    android:id="@+id/button8"
    android:layout_width="0dp"
    android:layout_height="0dp"
    android:layout_marginEnd="5dp"
    android:layout_marginStart="5dp"
    android:text="08"
    android:textStyle="bold"
    app:layout_constraintStart_toEndOf="@+id/button7"
    app:layout_constraintEnd_toStartOf="@+id/button9"
    app:layout_constraintTop_toTopOf="@+id/button6"
    app:layout_constraintBottom_toBottomOf="@+id/button6"
    />

<Button
    android:id="@+id/button9"
    android:layout_width="0dp"
    android:layout_height="0dp"
    android:layout_marginEnd="5dp"
    android:layout_marginStart="5dp"
    android:text="09"
    android:textStyle="bold"
    app:layout_constraintStart_toEndOf="@+id/button8"
    app:layout_constraintEnd_toStartOf="@+id/button10"
    app:layout_constraintTop_toTopOf="@+id/button6"
    app:layout_constraintBottom_toBottomOf="@+id/button6"
    />

<Button
    android:id="@+id/button10"
    android:layout_width="0dp"
    android:layout_height="0dp"
    android:layout_marginEnd="10dp"
    android:layout_marginStart="5dp"
    android:text="10"
    android:textStyle="bold"
    app:layout_constraintStart_toEndOf="@+id/button9"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintTop_toTopOf="@+id/button6"
    app:layout_constraintBottom_toBottomOf="@+id/button6"
    />

<Button
    android:id="@+id/button11"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:layout_marginEnd="5dp"
    android:layout_marginStart="10dp"
    android:layout_marginTop="5dp"
    android:layout_marginBottom="8dp"
    android:text="11"
    android:textStyle="bold"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintEnd_toStartOf="@+id/button7"
    app:layout_constraintTop_toBottomOf="@+id/button6" 
    app:layout_constraintBottom_toBottomOf="parent"
    />

<Button
    android:id="@+id/button12"
    android:layout_width="0dp"
    android:layout_height="0dp"
    android:layout_marginEnd="5dp"
    android:layout_marginStart="5dp"
    android:text="12"
    android:textStyle="bold"
    app:layout_constraintStart_toEndOf="@+id/button11"
    app:layout_constraintEnd_toStartOf="@+id/button13"
    app:layout_constraintTop_toTopOf="@+id/button11"
    app:layout_constraintBottom_toBottomOf="@+id/button11"
    />

<Button
    android:id="@+id/button13"
    android:layout_width="0dp"
    android:layout_height="0dp"
    android:layout_marginEnd="5dp"
    android:layout_marginStart="5dp"
    android:text="13"
    android:textStyle="bold"
    app:layout_constraintStart_toEndOf="@+id/button12"
    app:layout_constraintEnd_toStartOf="@+id/button14"
    app:layout_constraintTop_toTopOf="@+id/button11"
    app:layout_constraintBottom_toBottomOf="@+id/button11"
    />

<Button
    android:id="@+id/button14"
    android:layout_width="0dp"
    android:layout_height="0dp"
    android:layout_marginEnd="5dp"
    android:layout_marginStart="5dp"
    android:text="14"
    android:textStyle="bold"
    app:layout_constraintStart_toEndOf="@+id/button13"
    app:layout_constraintEnd_toStartOf="@+id/button14"
    app:layout_constraintTop_toTopOf="@+id/button11"
    app:layout_constraintBottom_toBottomOf="@+id/button11"
    />

<Button
    android:id="@+id/button15"
    android:layout_width="0dp"
    android:layout_height="0dp"
    android:layout_marginEnd="10dp"
    android:layout_marginStart="5dp"
    android:text="15"
    android:textStyle="bold"
    app:layout_constraintStart_toEndOf="@+id/button14"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintTop_toTopOf="@+id/button11"
    app:layout_constraintBottom_toBottomOf="@+id/button11"
    />

应用程序:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent"