Программно добавить представление в ConstraintLayout

Я пытаюсь добавить представление в том же месте, что и другое представление в ConstraintLayout, но добавленное представление не получает LayoutParams другого представления.

Добавленный вид размещается в верхнем левом углу контейнера.

Это мой код:

TextView cloneView = new TextView(getContext());
cloneView.setLayoutParams(otherView.getLayoutParams());
mainContainer.addView(cloneView);

person BenjaminBihr    schedule 16.03.2017    source источник


Ответы (1)


Чтобы добавить представления в ConstraintLayout, вы должны добавить ограничения с помощью ConstraintSet.

View v = findViewById(...);
ConstraintLayout cl = (ConstraintLayout) findViewById(...);


ConstraintSet c = new ConstraintSet();
cl.addView(v);
int id = v.getId();

c.clone(cl);
c.connect(id, ConstraintSet.Top, otherViewIdAboveV, ConstraintSet.BOTTOM, 0);
...
other constraints
...
c.applyTo(cl);
person Juan    schedule 16.03.2017
comment
clone () — копирование ограничений из макета, что, если макет является родительским и не имеет ограничений? - person Pavel Poley; 02.03.2018
comment
@PavelPoley Я не уверен, что понял комментарий. Дело в том, что родителем является ConstraintLayout, и, делая это, вы добавляете к нему представления с соответствующими ограничениями. Если на момент добавления нового представления у него нет ограничений, все равно для него придется добавить новые ограничения. - person Juan; 02.03.2018