代码之家  ›  专栏  ›  技术社区  ›  Nickolay Savchenko

ConstraintSet是否与Group一起工作?

  •  1
  • Nickolay Savchenko  · 技术社区  · 6 年前

    我有嵌套的constraintlayout布局,以及其他约束布局,用于将它们应用到第一个布局。我试图通过应用不同的约束集来使用组约束来隐藏/显示一些视图。

    <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的约束,但可见性没有更改。 我做错了什么?约束是否考虑到组的?

    更新

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

    2 回复  |  直到 6 年前
        1
  •  1
  •   Juanjo Berenguer    6 年前

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

    但我正在查看布局,而您正在使用Group对象中的visibility=“Gone”。

    例如,如果已将一些视图附加到组中,则可以仅更改组的可见性即可更改项的可见性状态。

    示例\布局

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

    然后在活动/片段中,您应该能够根据您的条件改变Java中的状态。

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

    我希望它能帮助你理解群体领域。

        2
  •  1
  •   Pawel Laskowski    6 年前

    你可以改变 Group's 可见性使用 ConstraintSet . 你的问题 ConstraintSets 你并没有真正改变他们之间的可见性。在你设置的第一个 visibility 图像2、图像3和图像4到 gone . 在第二个选项中,将Image4的可见性设置为 跑了 . 这意味着所有这些 Views 将保持不变( 跑了 )因为没有什么改变。

    在应用第二个时显示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 标签。它只用于控制引用对象的可见性 意见 .