【问题标题】:ConstraintLayout views at top left when added programatically以编程方式添加时左上角的 ConstraintLayout 视图
【发布时间】:2018-11-09 22:19:38
【问题描述】:

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

这是容器布局:

<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);
}

正如我上面提到的,结果是所有视图都位于左上角。要清楚 - point.x 和 point.y 是正确的,并且肯定不指向左上角。

非常感谢, 乔拉。

【问题讨论】:

    标签: android android-constraintlayout


    【解决方案1】:

    为了约束新添加的Views,您应该克隆父布局的ConstraintSet,而不是正在添加的View。在定义约束之后,这个ConstraintSet 应该被应用到父布局。还要确保在克隆 ConstraintSet 之前将新的 View 添加到布局中。

    在您的情况下,添加的 View 也是 ConstraintLayout,这就是为什么您在克隆集合时没有收到任何错误。

    这些行:

    constraintSet.clone(levelItem);
    constraintSet.applyTo(levelItem);
    

    应该改为:

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

    【讨论】:

    • 非常感谢!这成功了......我将添加addView必须在clone()之前发生的答案。再次感谢。
    • 不错的建议,我错过了!更新了答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-08
    • 2012-03-29
    • 2021-10-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多