如何将视图相对于非同级视图居中?

时间:2019-05-20 15:21:17

标签: android android-layout

在此布局中,我尝试使复选框(id:复选框)相对于第一个包含的布局(id:1)垂直居中。截至目前,我已经添加了一个简单的边距来临时解决此问题。我无法使用用户约束布局,因为该复选框不是我希望相对于其居中的布局的同级对象。

如何使复选框相对于布局垂直居中?

<?xml version="1.0" encoding="utf-8"?>
<layout 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">

    <androidx.constraintlayout.widget.ConstraintLayout
        android:id="@+id/layout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <CheckBox
            android:id="@+id/checkbox"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            android:layout_marginTop="20dp"/>   <!--Hax, should be centered to 1-->

        <LinearLayout
            android:id="@+id/layout_2"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:orientation="vertical"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toEndOf="@+id/checkbox"
            app:layout_constraintTop_toTopOf="parent">

            <include
                android:id="@+id/1"
                layout="@layout/1" />

            <include
                android:id="@+id/2"
                layout="@layout/2" />

            <include
                android:id="@+id/3"
                layout="@layout/3" />
        </LinearLayout>

    </androidx.constraintlayout.widget.ConstraintLayout>
</layout>

1 个答案:

答案 0 :(得分:1)

如果从视图层次结构中删除layout_2 LinearLayout,那么您将能够做您想做的事情。

从您的问题尚不清楚,您所包含的布局是否需要LinearLayout父级(例如,对于layout_weight属性),但是我敢打赌,即使这样也可以解决。

<androidx.constraintlayout.widget.ConstraintLayout
    android:id="@+id/layout"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <CheckBox
        android:id="@+id/checkbox"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:layout_constraintTop_toTopOf="@+id/1"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintBottom_toBottomOf="@+id/1"/>

    <include
        layout="@layout/1" 
        android:id="@+id/1"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintStart_toEndOf="@+id/checkbox"
        app:layout_constraintEnd_toEndOf="parent"/>

    <include
        layout="@layout/2"
        android:id="@+id/2"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        app:layout_constraintTop_toBottomOf="@+id/1"
        app:layout_constraintStart_toEndOf="@+id/checkbox"
        app:layout_constraintEnd_toEndOf="parent"/>

    <include
        layout="@layout/3"
        android:id="@+id/3"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        app:layout_constraintTop_toBottomOf="@+id/2"
        app:layout_constraintStart_toEndOf="@+id/checkbox"
        app:layout_constraintEnd_toEndOf="parent"/>

</androidx.constraintlayout.widget.ConstraintLayout>

此布局将123视图放置在垂直的“线”中,以模拟LinearLayout。因为它们现在是CheckBox的同级视图,所以您可以将CheckBox的顶部和底部限制在1视图的顶部和底部,使其垂直居中。

如果要使用权重,则可以将底部约束添加到123视图中以形成垂直链,然后可以指定app:layout_constraintVertical_weight属性。