Вы видите правильное поведение.Когда вы помещаете представление в группу, вы отказываетесь от возможности изменять видимость отдельного представления.Я думаю, что механизм заключается в том, что видимость представления устанавливается (вами), а затем видимость группы назначается (системой) на основе членства в группе.
Обходной путь зависит от ваших потребностей:
- Сохраняйте вид, которым вы хотите управлять видимостью вне группы;
- Управляйте своей собственной групповой логикой и забывайте группы, предлагаемые системой;
- Управляйте членством в группе с помощью setReferencedIds .
Я думаю, что это распространенная жалоба, но я также думаю, что она вряд ли будет решена.(ИМХО)
Я только что прокомментировал еще один вопрос, касающийся именно этой проблемы, поэтому я позволил себе опубликовать здесь (хотя ответ уже принят) простой класс, который поможет управлять ConstraintLayout
group.
ManagedGroup.java
<code>/**
* Manage a ConstraintLayout Group view membership as a view's visibility is changed. Calling
* {@link #setVisibility(View, int)} will set a view's visibility and remove it from the group.
* Other methods here provide explicit means to manage a group's view membership.
* <p>
* Usage: In XML define
* <pre>{@code
* <[Package].ManagedGroup
* android:id="@+id/group"
* android:layout_width="wrap_content"
* android:layout_height="wrap_content"
* android:visibility="visible"
* app:constraint_referenced_ids="id1,id2,id3..." />}
*
* / открытый класс ManagedGroup extends Group {private final Set mRemovedRefIds = new HashSet <> ();public ManagedGroup (Context context) {супер (context);} public ManagedGroup (Context context, AttributeSet attrs) {super (context, attrs);} public ManagedGroup (Контекст контекста, атрибуты AttributeSet, int defStyleAttr) {super (context, attrs, defStyleAttr);} / ** * Установить ссылочные идентификаторы для группы и очистить удаленный массив идентификаторов.* * @param ids Все идентификаторы в группе.* / @Override public void setReferencedIds (@NonNull int [] ids) {super.setReferencedIds (ids);mRemovedRefIds.clear ();} / ** * Установить видимость для представления и удалить идентификатор представления из группы.* * @param view Просмотр для изменения видимости * @param видимость View.VISIBLE, View.INVISIBLE или View.GONE.* / public void setVisibility (@NonNull View view, int visibility) {removeReferencedIds (view.getId ());view.setVisibility (видимость);} / ** * Добавить все удаленные представления обратно в группу.* / public void resetGroup () {setReferencedIds (getAllReferencedIds ());} / ** * Удалить ссылочные идентификаторы из группы.Это делается автоматически при вызове * setVisibility (View view, int visibility).* * @param idsToRemove Все идентификаторы для удаления из группы.* / public void removeReferencedIds (int ... idsToRemove) {for (int id: idsToRemove) {mRemovedRefIds.add (id);} int [] refIds = getReferencedIds ();Set newRefIdSet = new HashSet <> ();for (int id: refIds) {if (! mRemovedRefIds.contains (id)) {newRefIdSet.add (id);}} super.setReferencedIds (copySetToIntArray (newRefIdSet));} / ** * Добавить ссылочные идентификаторы в группу.* * @param idsToAdd Идентификаторы для добавления в группу.* / public void addReferencedIds (int ... idsToAdd) {for (int id: idsToAdd) {mRemovedRefIds.remove (id);} super.setReferencedIds (joinArrays (getReferencedIds (), idsToAdd));} / ** * Возвращает int [] всех идентификаторов в группе плюс удаленные.* * @return Все текущие идентификаторы в группе плюс удаленные.* / @NonNull public int [] getAllReferencedIds () {return joinArrays (getReferencedIds (), copySetToIntArray (mRemovedRefIds));} @NonNull private int [] copySetToIntArray (Set fromSet) {int [] toArray = new int [fromSet.size ()];int i = 0;for (int id: fromSet) {toArray [i ++] = id;} return toArray;} @NonNull private int [] joinArrays (@NonNull int [] array1, @NonNull int [] array2) {int [] joinArray = new int [array1.length + array2.length];System.arraycopy (array1, 0, joinArray, 0, array1.length);System.arraycopy (array2, 0, joinArray, array1.length, array2.length);вернуть joinArray;}}