Установка ограничений программным способом через 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 ответа
Я не слежу за вашими двумя макетами и тем, как они взаимодействуют, но, как правило, вы должны добавить представление и соединить его следующим образом:
- Создать TextView
- Добавить вид в макет
- Создайте ConstraintSet
- Клонируйте ограничения макета (и идентификаторы) в ConstraintSet
cs.clone(layout)
- Сделайте связи
- Примените ConstraintSet к макету:
constraintSet.applyTo(myLayout)
Кроме того, поскольку вы удаляете все представления из myLayout
и ничего не добавляя к нему, ваш макет просто будет пустым. Исправьте то, что указано выше.
Существует определенный порядок, которому вы должны следовать при использовании . Я не слишком уверен, почему исчезает только первое представление, но я предполагаю, что что-то пошло не так при попытке установить ограничения для первого представления.
Правильный способ установить ограничения:
- Добавьте все представления в макет ограничения
- макет ограничения
- Добавьте свои ограничения с помощью
connect
-
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);