ConstraintSet是否可以与Group一起使用?

时间:2018-09-05 18:39:35

标签: android android-constraintlayout

我有带有嵌套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是否考虑了Group的约束?

更新

我试图在不具有组的视图中直接使用可见性。它的工作(可见性更改在布局检查器中是正确的)。但是我遇到了另一个问题-一些观点被打破了。我认为,因为View在第一个xml中具有属性app:layout_constraintTop_toTopOf="parent",而在另一个布局中具有其他属性,但是不需要旧的attr!我无法清理旧属性并应用新属性?

2 个答案:

答案 0 :(得分:1)

我对约束组字段了解不多。

但是我正在观看布局,并且您在组对象中使用了visibleibility =“ gone”。

例如,如果您将某些视图附加到组中,则只需更改组的可见性即可更改项目的可见性状态

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);

我希望它可以帮助您了解“组”字段。

答案 1 :(得分:1)

您可以使用Group's更改ConstraintSet的可见性。 ConstraintSets的问题在于您并没有真正改变它们之间的可见性。在第一个中,将image2,image3和image4的visibility设置为gone。在第二个中,将image4的可见性设置为gone。这意味着所有这些Views的可见性将保持不变(gone),因为什么都没有真正改变。

要在应用第二个ConstraintSet时显示image2和image3,您应该这样做(在第二个布局中):

<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的可见性。