Установка ограничений программным способом через constraintSet приводит к исчезновению представлений

Каждый раз, когда я подключаю два виджета, начальный элемент больше не отображается. К сожалению, я не знаю, в чем причина этой проблемы. ConstraintLayout myLayout уже раздувается в другом макете.

ConstraintLayout myLayout= getActivity().findViewById(R.id.myID);
myLayout.removeAllViews();

ConstraintSet constraintSet = new ConstraintSet();

CheckBox cb = new CheckBox(myLayout.getContext());
cb.setText("CHECKBOX");
cb.setId(View.generateViewId());

myLayout.addView(cb);

constraintSet.connect(cb.getId(),ConstraintSet.END,myLayout.getId(),ConstraintSet.END);
constraintSet.connect(cb.getId(),ConstraintSet.TOP,myLayout.getId(),ConstraintSet.TOP);

constraintSet.applyTo(myLayout);

3 ответа

Я не слежу за вашими двумя макетами и тем, как они взаимодействуют, но, как правило, вы должны добавить представление и соединить его следующим образом:

  1. Создать TextView
  2. Добавить вид в макет
  3. Создайте ConstraintSet
  4. Клонируйте ограничения макета (и идентификаторы) в ConstraintSet cs.clone(layout)
  5. Сделайте связи
  6. Примените ConstraintSet к макету:constraintSet.applyTo(myLayout)

Кроме того, поскольку вы удаляете все представления из myLayoutи ничего не добавляя к нему, ваш макет просто будет пустым. Исправьте то, что указано выше.

Существует определенный порядок, которому вы должны следовать при использовании . Я не слишком уверен, почему исчезает только первое представление, но я предполагаю, что что-то пошло не так при попытке установить ограничения для первого представления.

Правильный способ установить ограничения:

  1. Добавьте все представления в макет ограничения
  2. макет ограничения
  3. Добавьте свои ограничения с помощьюconnect
  4. applyToмакет ограничения

Кроме того, вы должны использоватьConstraintSet.PARENT_IDвместоmyLayout.getId().

Итак, перетасовывая строки кода и добавляяclone:

      ConstraintLayout myLayout = getActivity().findViewById(R.id.myID);
myLayout.removeAllViews();

CheckBox cb = new CheckBox(myLayout.getContext());
cb.setText("CHECKBOX");
cb.setId(View.generateViewId());

// 1. Add all the views to the constraint layout
myLayout.addView(cb);

// 2. `clone` the constraint layout
ConstraintSet constraintSet = new ConstraintSet();
constraintSet.clone(myLayout);

// 3. Add your constraints with `connect`
constraintSet.connect(cb.getId(), ConstraintSet.END, ConstraintSet.PARENT_ID, ConstraintSet.END);
constraintSet.connect(cb.getId(), ConstraintSet.TOP, ConstraintSet.PARENT_ID, ConstraintSet.TOP);

// 4. `applyTo` the constraint layout
constraintSet.applyTo(myLayout);

К сожалению, я не видел официальной документации по этому поводу, это только то, что я понял изConstraintSetисходный код и некоторые эксперименты.

Отображать после установки ограничений, например

    ConstraintLayout myLayout= findViewById(R.id.lo1);
    myLayout.removeAllViews();

    ConstraintSet constraintSet = new ConstraintSet();

    CheckBox cb = new CheckBox(myLayout.getContext());
    cb.setText("CHECKBOX");
    cb.setId(View.generateViewId());


    constraintSet.connect(cb.getId(),ConstraintSet.END,myLayout.getId(),ConstraintSet.END);
    constraintSet.connect(cb.getId(),ConstraintSet.TOP,myLayout.getId(),ConstraintSet.TOP);

    constraintSet.applyTo(myLayout);
    myLayout.addView(cb);
Другие вопросы по тегам