Constraintlayout: программно добавлять элементы пользовательского интерфейса.

Я пытаюсь динамически добавить новый ImageView под существующий XML-определенный ImageView в ConstraintLayout:

    ConstraintLayout layout = (ConstraintLayout)findViewById(R.id.constraintLayout);

    ImageView imgAbove = (ImageView)findViewById(R.id.topItemImg);
    ImageView imgBelow = new ImageView(this);
    imgBelow.setBackgroundColor(Color.YELLOW);
    imgBelow.setId(View.generateViewId());

    ConstraintLayout.LayoutParams imgAboveLayout = (ConstraintLayout.LayoutParams) imgAbove.getLayoutParams();
    ConstraintLayout.LayoutParams imgBelowLayout = new ConstraintLayout.LayoutParams(imgAboveLayout);

    imgBelowLayout.topToBottom = imgAbove.getId();
    imgAboveLayout.bottomToTop = imgBelow.getId();

    layout.addView(imgBelow);
    imgBelow.setLayoutParams(imgBelowLayout);
    imgAbove.setLayoutParams(imgAboveLayout);

Однако это помещает новое представление поверх существующего, так что они полностью перекрываются. Что я делаю неправильно?

Вам нужно будет программно добавить constraintSet.

Jeel Vankhede 26.10.2018 07:55

Почему я не могу использовать ConstraintLayout.LayoutParams? Я слышал, что и ConstraintLayout.LayoutParams, и ConstraintSet можно использовать для динамического добавления в ConstraintLayouts, но использование LayoutParams более эффективно, поскольку не требует клонирования всего существующего макета для всех представлений.

deekay42 26.10.2018 08:02

Params можно использовать при программной сборке с нуля, но у вас уже есть одно представление! поэтому используйте ConstraintSet.

Jeel Vankhede 26.10.2018 08:10
1
3
353
1

Ответы 1

Попробуйте этот код:

ConstraintLayout layout = (ConstraintLayout)findViewById(R.id.constraintLayout);

ImageView imgAbove = (ImageView)findViewById(R.id.topItemImg);
ImageView imgBelow = new ImageView(this);
imgBelow.setBackgroundColor(Color.YELLOW);
imgBelow.setId(View.generateViewId());

ConstraintLayout.LayoutParams imgAboveLayout = (ConstraintLayout.LayoutParams) imgAbove.getLayoutParams();
ConstraintLayout.LayoutParams imgBelowLayout = new ConstraintLayout.LayoutParams(imgAboveLayout);
layout.addView(imgBelow);
imgBelow.setLayoutParams(imgBelowLayout);
imgAbove.setLayoutParams(imgAboveLayout);

// Clone your constraint layout to ConstraintSet.
ConstraintSet set = new ConstraintSet();
set.clone(layout);
set.connect(imgBelow.getId(), ConstraintSet.TOP, imgAbove.getId(), ConstraintSet.BOTTOM, 0);
set.connect(imgBelow.getId(), ConstraintSet.START, imgAbove.getId(), ConstraintSet.START, 0);
set.connect(imgBelow.getId(), ConstraintSet.END, imgAbove.getId(), ConstraintSet.END, 0);
set.applyTo(layout);

Узнайте больше от здесь.

Note here :For building up constraints at run time, using ConstraintSet is recommended.

Я пробовал это, но результат тот же. Кроме того, почему вы смешиваете LayoutParams с ConstraintSet? Разве это не должно быть одно или другое?

deekay42 26.10.2018 22:04

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