Невозможно установить видимость отдельных элементов в ConstraintLayout.Group. - PullRequest
0 голосов
/ 28 ноября 2018

У меня есть ConstraintLayout.Group, определенный следующим образом:

    <android.support.constraint.Group
        android:id="@+id/someGroup"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:constraint_referenced_ids="
        textView1,
        textView2,
        button1" />

Я изменяю видимость этой группы с GONE на VISIBLE:

someGroup.visibility = VISIBLE

Но когда я пытаюсь переопределить ееуказав видимость одного из представлений в этой группе:

button1.visibility = GONE

... это не работает.Я записываю эту видимость в logcat, и она говорит 8 (GONE), , но я все еще могу видеть представление .

Есть идеи, что здесь может происходить?Я попытался позвонить requestLayout и updatePreLayout в этой группе, я несколько раз пытался изменить видимость, видимую, невидимую, а затем пропал.Я даже перестроил весь проект, потому что в каком-то ответе stackoverflow говорилось, что это может помочь при проблемах видимости в ConstraintLayout.Я также пробовал версии 1.1.3 и 2.2.0-альфа.Ничего не получалось.Это всегда видно.

1 Ответ

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

Вы видите правильное поведение.Когда вы помещаете представление в группу, вы отказываетесь от возможности изменять видимость отдельного представления.Я думаю, что механизм заключается в том, что видимость представления устанавливается (вами), а затем видимость группы назначается (системой) на основе членства в группе.

Обходной путь зависит от ваших потребностей:

  1. Сохраняйте вид, которым вы хотите управлять видимостью вне группы;
  2. Управляйте своей собственной групповой логикой и забывайте группы, предлагаемые системой;
  3. Управляйте членством в группе с помощью 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;}}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...