Java 如何以编程方式将视图和约束添加到ConstraintLayout?

Java 如何以编程方式将视图和约束添加到ConstraintLayout?,java,android,android-layout,android-constraintlayout,Java,Android,Android Layout,Android Constraintlayout,我遇到了一个问题,无法通过编程将视图添加到ConstraintLayout,并设置布局工作所需的所有约束 我目前拥有的东西不起作用: ConstraintLayout layout = (ConstraintLayout) findViewById(R.id.mainConstraint); ConstraintSet set = new ConstraintSet(); set.clone(layout); ImageView view = new ImageView(this); layo

我遇到了一个问题,无法通过编程将视图添加到
ConstraintLayout
,并设置布局工作所需的所有约束

我目前拥有的东西不起作用:

ConstraintLayout layout = (ConstraintLayout) findViewById(R.id.mainConstraint);
ConstraintSet set = new ConstraintSet();
set.clone(layout);

ImageView view = new ImageView(this);
layout.addView(view,0);
set.connect(view.getId(), ConstraintSet.TOP, layout.getId(), ConstraintSet.TOP, 60);
set.applyTo(layout);
ImageView
甚至没有出现在布局上。当添加到
RelativeLayout
时,它就像一个符咒


如何创建所需的约束,使布局再次工作?

我认为您应该在添加ImageView后克隆布局

ConstraintLayout parentLayout=(ConstraintLayout)findViewById(R.id.mainConstraint);
ConstraintSet集合=新ConstraintSet();
ImageView子视图=新的ImageView(此);
//设置视图id,否则getId()返回-1
setId(View.generateViewId());
parentLayout.addView(childView,0);
set.clone(parentLayout);
//连接视图的起点和终点,在本例中,将子视图的顶部连接到父视图的顶部。
set.connect(childView.getId(),ConstraintSet.TOP,parentLayout.getId(),ConstraintSet.TOP,60);
// ... 类似地,添加其他约束
set.applyTo(父布局);

为什么这样做?请解释一下。谢谢@YonahKarp在将约束布局克隆到集合之前,首先要将所有子项添加到约束布局中,因此所有添加的视图都包括在内。我想指出的是,您还需要以编程方式设置id,否则所有getId()都将返回-1I我花了这么多时间,而且解决方案太简单,文档中指出了这一点吗?你怎么知道的?@diegornandomurillovalenci应用约束集似乎会清除以前应用的约束集,并且知道可以先使用克隆提取旧约束集,然后添加新约束并应用它。换句话说,可以向现有constraintlayout添加一个约束,但不能向现有constraintset添加一个约束。这只是我基于这个答案的推论。我对这个东西和安卓系统都很陌生。