Android 如何在屏幕中央对齐 3 个视图

How to align 3 Views in the center of the screen in Android

我正在尝试在屏幕中央对齐三个元素(视图),如下图所示:

目标是将屏幕中央的这 3 个框与“倒三角形”格式对齐,其中两个框位于第一行,第三个框位于第二行,两者垂直居中标题和按钮,水平位于 parent 的限制之间。

这是我试过的:

<View
    android:id="@+id/v_box_male"
    android:layout_width="120dp"
    android:layout_height="120dp"
    android:layout_marginEnd="10dp"
    android:background="@drawable/border"
    app:layout_constraintBottom_toTopOf="@id/iv_other"
    app:layout_constraintEnd_toStartOf="@id/v_box_female"
    app:layout_constraintHorizontal_chainStyle="packed"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toBottomOf="@id/tv_gender"/>

(...)

<View
    android:id="@+id/v_box_female"
    android:layout_width="120dp"
    android:layout_height="120dp"
    android:layout_marginStart="10dp"
    android:background="@drawable/border"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toEndOf="@id/v_box_male"
    app:layout_constraintTop_toTopOf="@id/v_box_male" />

(...)

<View
    android:id="@+id/v_box_other"
    android:layout_width="120dp"
    android:layout_height="120dp"
    android:background="@drawable/border"
    app:layout_constraintTop_toBottomOf="@id/v_box_male"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintBottom_toTopOf="@id/bt_next" />

然而,第三个盒子没有被“打包”到它上面的其他两个盒子。

这是目前的结果:

男盒使用此码

<View
 android:id="@+id/v_box_male"
 android:layout_width="120dp"
 android:layout_height="120dp"
 android:layout_marginEnd="10dp"
 android:background="@drawable/border"
 app:layout_constraintEnd_toStartOf="@id/v_box_female"
 app:layout_constraintHorizontal_chainStyle="packed"
 app:layout_constraintStart_toStartOf="parent"
 app:layout_constraintTop_toBottomOf="@id/tv_gender"
/>

尝试在 v_box_other 中添加一个 layout_marginTop:

<View
    android:id="@+id/v_box_other"
    android:layout_width="120dp"
    android:layout_height="120dp"
    android:background="@drawable/border"
    android:layout_marginTop="10dp"
    app:layout_constraintTop_toBottomOf="@id/v_box_male"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintBottom_toTopOf="@id/bt_next" />

看来我找到了答案。问题出在 v_box_maleapp:layout_constraintBottom_toTopOf="@id/iv_other" 上。它引用的是图像视图(性别符号)而不是视图(框)。

它还缺少 app:layout_constraintVertical_chainStyle="packed"

正确代码如下:

<View
    android:id="@+id/v_box_male"
    android:layout_width="120dp"
    android:layout_height="120dp"
    android:layout_marginEnd="10dp"
    android:layout_marginBottom="10dp"
    android:background="@drawable/border"
    app:layout_constraintBottom_toTopOf="@id/v_box_other"
    app:layout_constraintEnd_toStartOf="@id/v_box_female"
    app:layout_constraintHorizontal_chainStyle="packed"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toBottomOf="@id/tv_gender"
    app:layout_constraintVertical_chainStyle="packed" />

<View
    android:id="@+id/v_box_female"
    android:layout_width="120dp"
    android:layout_height="120dp"
    android:layout_marginStart="10dp"
    android:background="@drawable/border"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toEndOf="@id/v_box_male"
    app:layout_constraintTop_toTopOf="@id/v_box_male" />

<View
    android:id="@+id/v_box_other"
    android:layout_width="120dp"
    android:layout_height="120dp"
    android:layout_marginTop="10dp"
    android:background="@drawable/border"
    app:layout_constraintBottom_toTopOf="@id/bt_next"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toBottomOf="@id/v_box_male" />
<LinearLayout 
    android:layout_height="match_parent"
    android:layout_width="wrap_content"
    android:orientation="vertical">
    <LinearLayout 
       android:layout_height="match_parent"
       android:layout_width="wrap_content"
       android:orientation="horizontal">
       <View android:layout_height="match_parent"
             android:layout_width="wrap_content"
             android:layout_gravity="center"
             android:layout_weight="1"/>
       <View android:layout_height="match_parent"
             android:layout_width="wrap_content"
             android:layout_gravity="center"
             android:layout_weight="1"/>
    </LinearLayout>
    <LinearLayout 
    android:layout_height="match_parent"
    android:layout_width="wrap_content"
    android:orientation="vertical">
       <View android:layout_height="match_parent"
             android:layout_width="wrap_content"
             android:layout_gravity="center"/>
    </LinearLayout>
</LinearLayout>

是示例代码,因为现在无法拥有设备,但我认为它可能对了解想法很有用。 上面的代码您可以使用 LinearLayout 而不是 View 并且该布局可以放置性别图像。

希望大家能理解,不明白的请评论