ConstraintLayout представления в верхнем левом углу при добавлении программно - PullRequest
0 голосов
/ 10 ноября 2018

Хотя я видел несколько похожих вопросов, ни один из ответов не работал для меня. Может быть, мне не хватает чего-то простого, но я не вижу, что это такое. У меня есть 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 верны и точно не указывают на верхний левый угол.

Большое спасибо, Giora.

1 Ответ

0 голосов
/ 10 ноября 2018

Чтобы ограничить добавленное Views, вы должны клонировать ConstraintSet родительского макета вместо View, который добавляется. После определения ограничений этот ConstraintSet должен быть применен к родительскому макету. Также убедитесь, что новый View добавлен в макет перед клонированием ConstraintSet.

В вашем случае добавленный View также является ConstraintLayout, поэтому вы не получаете никаких ошибок при клонировании набора.

Эти строки:

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

следует изменить на:

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