Android 按编程方式添加时,约束左上角的视图

Android 按编程方式添加时,约束左上角的视图,android,android-constraintlayout,Android,Android Constraintlayout,虽然我看到了一些类似的问题,但没有一个答案对我有用。也许我错过了一些简单的东西,但我看不出它是什么。 我有一个里面有图像视图的约束图。我正在动态添加视图&相对于图像视图。所有视图都固定在图像视图的左上角 以下是容器布局: <android.support.constraint.ConstraintLayout android:id="@+id/mapLayout" android:layout_width="wrap_content"

虽然我看到了一些类似的问题,但没有一个答案对我有用。也许我错过了一些简单的东西,但我看不出它是什么。 我有一个里面有图像视图的约束图。我正在动态添加视图&相对于图像视图。所有视图都固定在图像视图的左上角

以下是容器布局:

<android.support.constraint.ConstraintLayout
            android:id="@+id/mapLayout"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content">

            <ImageView
                android:id="@+id/mapImage"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:scaleType="matrix"
                android:src="@drawable/fullmap"
                app:layout_constraintTop_toTopOf="parent"
                app:layout_constraintStart_toStartOf="parent"/>

        </android.support.constraint.ConstraintLayout>

下面是添加这些视图的代码:

Map<Integer, Point> positions = createPoints(levels);
ConstraintLayout mapLayout = findViewById(R.id.mapLayout);
LayoutInflater inflater = LayoutInflater.from(this);
for (int i = 0; i < levels.size(); i++) {
    ConstraintLayout levelItem = (ConstraintLayout) inflater.inflate(R.layout.quest_map_level_item, mapLayout, false);
    levelItem.setId(i);
    Point point = positions.get(i);
    ConstraintSet constraintSet = new ConstraintSet();
    constraintSet.clone(levelItem);
    mapLayout.addView(levelItem);
    constraintSet.connect(levelItem.getId(), ConstraintSet.START, R.id.mapLayout, ConstraintSet.START, point.x);
    constraintSet.connect(levelItem.getId(), ConstraintSet.TOP, R.id.mapLayout, ConstraintSet.TOP, point.y);
    constraintSet.applyTo(levelItem);
}
Map positions=createPoints(levels);
ConstraintLayout mapLayout=findViewById(R.id.mapLayout);
LayoutFlater充气机=LayoutFlater.from(本机);
对于(int i=0;i
如上所述,结果是所有视图都位于左上角。需要明确的是,点.x和点.y是正确的,并且肯定没有指向左上角

非常感谢,
Giora.

为了约束新添加的
视图
,您应该克隆父布局的
约束集
,而不是正在添加的
视图
。定义约束后,该约束集应应用于父布局。在克隆
约束集
之前,还要确保将新的
视图
添加到布局中

在您的情况下,添加的
视图
也是一个
ConstraintLayout
,这就是为什么在克隆集合时不会出现任何错误

这些线路:

constraintSet.clone(levelItem);
constraintSet.applyTo(levelItem);
应改为:

constraintSet.clone(mapLayout);
constraintSet.applyTo(mapLayout);

非常感谢!这就成功了。。。我想补充一点,addView必须发生在clone()之前。再次感谢。很好的建议,我错过了!更新了答案。