ConstraintSet работает с группой или нет? - PullRequest
0 голосов
/ 05 сентября 2018

У меня есть макет с вложенным ConstraintLayout и другой макет с ограничениями для применения их к первому макету. Я пытаюсь использовать групповое ограничение для скрытия / отображения некоторых представлений посредством применения различных ConstraintSet.

<layout>
    <LinearLayout>

    <!-- Some Views here -->

    <android.support.constraint.ConstraintLayout>

        <!-- Some ImageViews with constraints (for different layouts images) -->

       <android.support.constraint.Group
           android:id="@+id/invisible_cells"
           android:layout_width="0dp"
           android:layout_height="0dp"
           android:visibility="gone"
           app:constraint_referenced_ids="image2,image3,image4"
           app:layout_constraintLeft_toLeftOf="parent"
           app:layout_constraintTop_toTopOf="parent" />

    </android.support.constraint.ConstraintLayout>

    </LinearLayout>
</layout>

И другой макет только с другими ограничениями:

<android.support.constraint.ConstraintLayout>

    <!-- Some ImageViews with constraints (for different layouts images) -->

   <android.support.constraint.Group
       android:id="@+id/invisible_cells"
       android:layout_width="0dp"
       android:layout_height="0dp"
       android:visibility="gone"
       app:constraint_referenced_ids="image4" <<=== other ids!
       app:layout_constraintLeft_toLeftOf="parent"
       app:layout_constraintTop_toTopOf="parent" />

</android.support.constraint.ConstraintLayout>

и применить:

ConstraintSet set2 = new ConstraintSet();
set2.load(context, R.layout.item_news_photos_constraints_2);
//...
set2.applyTo(binding.constraintLayout);

Это меняет ограничения ImageView, но видимость не меняется .. Что я делаю не так? ConstraintSet принимать во внимание группы или нет?

Обновление

Я пытаюсь использовать видимость непосредственно в представлениях без группы. Его работы (изменения видимости прямо в макете инспектора). Но я столкнулся с другой проблемой - некоторые взгляды нарушены. Я думаю, потому что View имеет атрибут app:layout_constraintTop_toTopOf="parent" в первом xml и другие атрибуты в другом макете, но старый attr не нужен! Я не могу очистить старые атрибуты и применить новые?

Ответы [ 2 ]

0 голосов
/ 05 сентября 2018

Вы можете изменить Group's visibilty, используя ConstraintSet. Проблема с вашим ConstraintSets заключается в том, что вы не меняете видимость между ними. В первом случае вы устанавливаете visibility для image2, image3 и image4 на gone. Во втором вы устанавливаете видимость image4 на gone. Это означает, что видимость всех этих Views останется неизменной (gone), потому что на самом деле ничего не изменилось.

Чтобы показать image2 и image3 при применении второго ConstraintSet, вы должны сделать это следующим образом (во втором макете):

<android.support.constraint.Group
    android:id="@+id/invisible_cells"
    android:layout_width="0dp"
    android:layout_height="0dp"
    android:visibility="visible"
    app:constraint_referenced_ids="image2,image3" />

В качестве примечания вам не нужно устанавливать никаких ограничений для тега android.support.constraint.Group. Он используется только для управления видимостью ссылочной Views.

0 голосов
/ 05 сентября 2018

Я не так много знаю о поле Constraint Group.

Но я наблюдаю за макетами, а вы используете видимость = "ушел" в объекте группы.

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

example_layout

<android.support.constraint.ConstraintLayout ...>
  <TextView
    android:id="@+id/text1" ... />
  <TextView
    android:id="@+id/text2" ... />
  <android.support.constraint.Group
    android:id="@+id/group"
    ...
    app:constraint_referenced_ids="text1,text2" />
</android.support.constraint.ConstraintLayout>

Тогда в Activity / Fragment вы сможете изменить состояние в Java в зависимости от ваших условий.

Group group = findViewById(R.id.group);
//Change the visibility when you need it.
group.setVisibility(View.GONE or View.VISIBLE);

Надеюсь, это поможет вам понять поле группы.

...