Как центрировать вид относительно вида, не являющегося братом? - PullRequest
0 голосов
/ 20 мая 2019

В этом макете я пытаюсь центрировать флажок (id: checkbox) относительно первого включенного макета (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 Ответ

1 голос
/ 20 мая 2019

Если вы удалите 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>

Этот макет помещает представления 1, 2 и 3 в вертикальную "линию", имитируя LinearLayout. Поскольку теперь они являются одноуровневыми представлениями CheckBox, вы можете ограничить верхнюю и нижнюю части CheckBox сверху и снизу вида 1, центрируя его вертикально.

Если вы хотите использовать весовые коэффициенты, вы можете добавить нижние ограничения к представлениям 1, 2 и 3, чтобы сформировать вертикальную цепочку, а затем вы можете указать атрибут app:layout_constraintVertical_weight.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...