【问题标题】:Does ConstraintSet works with Group or not?ConstraintSet 是否适用于 Group?
【发布时间】:2019-02-10 23:29:34
【问题描述】:

我有带有嵌套 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 !我无法清理旧属性并应用新属性?

【问题讨论】:

  • 我认为最后是 set.load 而不是 set2.load 是错字?
  • 是的,错字。非常感谢

标签: android android-constraintlayout


【解决方案1】:

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

但我正在查看布局,而您正在使用 group 对象中的 visibility="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);

希望对您理解 Group 字段有所帮助。

【讨论】:

  • 是的,没错。但这不是我的问题的答案。但无论如何,谢谢。
【解决方案2】:

您可以使用ConstraintSet 更改Group's 的可见性。 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 的可见性。

【讨论】:

  • 感谢您的回复。我正在尝试直接在没有组的视图中使用可见性。它的工作(在布局检查器可见性更改是正确的)。但是我遇到了另一个问题 - 一些视图被破坏了。我认为,这是因为在第一个 xml 视图中具有属性 app:layout_constraintTop_toTopOf="parent" 而在另一个中具有其他属性,但是不需要此属性!我无法清除旧属性并应用新属性?
  • 它使集合难以使用:(我需要声明所有属性只是为了“reset”
猜你喜欢
  • 2011-03-12
  • 1970-01-01
  • 2020-08-17
  • 1970-01-01
  • 2015-07-13
  • 2012-02-26
  • 1970-01-01
  • 2011-02-23
  • 2016-06-28
相关资源
最近更新 更多