Проблема добавления программных барьеров в ConstraintLayout - PullRequest
0 голосов
/ 28 июня 2019

У меня есть два барьера на основе XML, которые используются для разделения некоторых кнопок в календаре, который я создаю.Вот XML:

<android.support.constraint.ConstraintLayout
    android:id="@+id/teamScheduleConstraintLayout"
    android:layout_width="match_parent"
    android:layout_height="500dp"
    app:layout_constraintTop_toTopOf="parent">

    <Button
        android:id="@+id/buttonPreviousMonth"
        android:layout_width="90dp"
        android:layout_height="50dp"
        android:text="@string/previousMonth"
        app:layout_constraintEnd_toStartOf="@+id/teamScheduleCurrentMonth"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <TextView
        android:id="@+id/teamScheduleCurrentMonth"
        style="@style/textViewGeneral"
        android:layout_width="wrap_content"
        android:layout_height="50dp"
        android:gravity="center"
        android:text="July 2019"
        android:textSize="20sp"
        app:layout_constraintEnd_toStartOf="@+id/buttonNextMonth"
        app:layout_constraintStart_toEndOf="@+id/buttonPreviousMonth"
        app:layout_constraintTop_toTopOf="parent" />


    <Button
        android:id="@+id/buttonNextMonth"
        android:layout_width="90dp"
        android:layout_height="50dp"
        android:text="@string/nextMonth"
        android:textAlignment="center"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toEndOf="@+id/teamScheduleCurrentMonth"
        app:layout_constraintTop_toTopOf="parent" />

    <android.support.constraint.Barrier
        android:id="@+id/monthSelectorBarrier"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="horizontal"
        app:barrierDirection="bottom"
        app:constraint_referenced_ids="buttonPreviousMonth,teamScheduleCurrentMonth,buttonNextMonth" />


    <android.support.constraint.Barrier
        android:id="@+id/closeButtonBarrier"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="horizontal"
        app:barrierDirection="top"
        app:constraint_referenced_ids="teamScheduleCloseButton"
        app:layout_constraintTop_toBottomOf="@id/monthSelectorBarrier" />

    <Button
        android:id="@+id/teamScheduleCloseButton"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:gravity="center"
        android:text="@string/CloseButton"
        android:textAlignment="center"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/closeButtonBarrier" />

    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="TextView"
        tools:layout_editor_absoluteX="136dp"
        tools:layout_editor_absoluteY="211dp" />


</android.support.constraint.ConstraintLayout>

Далее я пытаюсь программно добавить новый барьер для каждой новой строки дней в календаре:

Barrier newRow = new Barrier(getContext());
int barrierId = View.generateViewId();
newRow.setId(barrierId);
newRow.setType(Barrier.BOTTOM);
layout.addView(newRow);

Допустим, я создал двановые барьеры, 1 и 2. Когда я ограничиваю некоторые TextViews в «@ + id / monthSelectorBarrier», они отображаются правильно.Но когда я ограничиваю их барьером 1, все они переходят к вершине обзора:

Barrier

Я устанавливаю первый новый барьер, чтобы сидеть прямов «@ + id / monthSelectorBarrier», используя код, подобный приведенному ниже, но он все еще идет в верхнюю часть ConstraintLayout.

Вот код для установки программно созданного барьера, чтобы он находился под другим программно созданным барьером (allDaysэто массив int идентификаторов TextView, поэтому я могу добавить их к каждому барьеру):

constraintSet.clone(layout);

constraintSet.connect(2, ConstraintSet.TOP, 1, ConstraintSet.BOTTOM);
constraintSet.connect(2, ConstraintSet.START, ConstraintSet.PARENT_ID, ConstraintSet.START);
constraintSet.connect(2, ConstraintSet.END, ConstraintSet.PARENT_ID, ConstraintSet.END);

constraintSet.connect(allDays[i], ConstraintSet.TOP, 2, ConstraintSet.BOTTOM);

constraintSet.applyTo(layout);

Что мне нужно изменить, чтобы все барьеры правильно выстроились друг под другом?

...