Программное соединение нескольких представлений любого размера с использованием ConstraintLayout

Я использую ConstraintLayout beta4 и пытаюсь программно создать горизонтальную цепочку на экране.

Проблема, с которой я сталкиваюсь, состоит в том, когда я соединяю несколько представлений в цепочку на экране.(ex: Left side of layout <-> leftButton <-> rightButton <-> Right side of layout)тогда ничего не появляется вообще.

Вот код, который не работает:

public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    ConstraintLayout layout = (ConstraintLayout) View.inflate(this, R.layout.activity_main, null);
    setContentView(layout);

    ConstraintSet set = new ConstraintSet();
    set.clone(layout);

    ConstraintLayout.LayoutParams anySizeParams = new ConstraintLayout.LayoutParams(0,0);

    ImageButton leftButton = new ImageButton(this);
    leftButton.setId(View.generateViewId());
    leftButton.setLayoutParams(anySizeParams);
    layout.addView(leftButton);

    ImageButton rightButton = new ImageButton(this);
    rightButton.setId(View.generateViewId());
    rightButton.setLayoutParams(anySizeParams);
    layout.addView(rightButton);

    set.connect(leftButton.getId(),ConstraintSet.LEFT,layout.getId(),ConstraintSet.LEFT,0);
    set.connect(leftButton.getId(),ConstraintSet.RIGHT,rightButton.getId(),ConstraintSet.LEFT,0);
    set.connect(leftButton.getId(),ConstraintSet.TOP,layout.getId(),ConstraintSet.TOP,0);
    set.connect(leftButton.getId(),ConstraintSet.BOTTOM,layout.getId(),ConstraintSet.BOTTOM,0);

    set.connect(rightButton.getId(),ConstraintSet.LEFT,rightButton.getId(),ConstraintSet.RIGHT,0);
    set.connect(rightButton.getId(),ConstraintSet.RIGHT,layout.getId(),ConstraintSet.RIGHT,0);
    set.connect(rightButton.getId(),ConstraintSet.TOP,layout.getId(),ConstraintSet.TOP,0);
    set.connect(rightButton.getId(),ConstraintSet.BOTTOM,layout.getId(),ConstraintSet.BOTTOM,0);

    set.applyTo(layout);

}
}

А вот скриншот приведенного выше кода: программно создан.

Ниже приведен некоторый XML-код, описывающий то же самое и прекрасно работающий для справки

<ImageButton
    android:layout_width="0dp"
    android:layout_height="0dp"
    android:id="@+id/right_button"
    app:layout_constraintLeft_toRightOf="@+id/left_button"
    app:layout_constraintRight_toRightOf="parent"
    app:layout_constraintTop_toTopOf="parent"
    app:layout_constraintBottom_toBottomOf="parent" />

<ImageButton
    android:layout_width="0dp"
    android:layout_height="0dp"
    android:id="@+id/left_button"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintRight_toLeftOf="@+id/right_button"
    app:layout_constraintTop_toTopOf="parent"
    app:layout_constraintBottom_toBottomOf="parent"/>

Вот скриншот xml: созданный вручную

1 ответ

Решение

Есть пара проблем с тем, что вы делаете. Во-первых, вы назначаете один и тот же экземпляр LayoutParams обоим объектам - это не сработает. Вам нужен отдельный экземпляр:

ConstraintLayout.LayoutParams anySizeParams2 = new ConstraintLayout.LayoutParams(0, 0);
rightButton.setLayoutParams(anySizeParams2);

Во-вторых, вы неправильно установили связь:

set.connect(rightButton.getId(),ConstraintSet.LEFT,
            rightButton.getId(),ConstraintSet.RIGHT,0);

должно быть:

set.connect(rightButton.getId(),ConstraintSet.LEFT,
            leftButton.getId(),ConstraintSet.RIGHT,0);

Как иначе это не собирается создавать цепочку.

Вероятно, было бы чище клонировать макет после добавления представлений тоже.

Другие вопросы по тегам