ปัญหาดั้งเดิมอย่างหนึ่งของการใช้ ConstraintLayout คือการกำหนดค่า Visibility ให้กับ View ที่อยู่ข้างในหลาย ๆ ตัวผ่านโค้ด Java หรือ Kotlin เพราะไม่เหมือนกับ Layout ตัวอื่น ๆ ที่ออกแบบมาให้ Grouping ได้ จึงทำให้เวลากำหนดค่า Visibility ก็กำหนดที่ Layout ตัวนั้น ๆ ได้เลย

จึงทำให้ ConstraintLayout เวอร์ชัน 1.1 ได้เพิ่มสิ่งที่เรียกว่า Group เข้ามา เพื่อช่วยให้นักพัฒนาสามารถจัดกลุ่มของ View ที่อยู่ใน ConstraintLayout เพื่อกำหนดค่า Visibility ได้ง่ายขึ้น

Group มีไว้ควบคุม Visibility ของ View

Group เป็นหนึ่งใน Constraint Helper ที่จะช่วยให้จัด View ตัวอื่น ๆ ได้ตามต้องการ จึงทำให้ตัวมันไม่มีการแสดงผลบนหน้าจอ เพื่อให้ View ต่าง ๆ ใช้อ้างอิงตำแหน่งเท่านั้น โดย Group จะตอบโจทย์กรณีที่ผู้ที่หลงเข้ามาอ่านมี View ใน ConstraintLayout ที่ต้องการกำหนด Visibility พร้อม ๆ กันหลายตัวผ่านโค้ด Java หรือ Kotlin

ในการสร้าง Group นั้นจะทำเหมือน View ทั่ว ๆ ไปแบบนี้

<androidx.constraintlayout.widget.ConstraintLayout 
    ... >
    
    <!-- ... -->
    
    <androidx.constraintlayout.widget.Group
        android:id="@+id/group1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:constraint_referenced_ids="textView1,textView2" />
    
</androidx.constraintlayout.widget.ConstraintLayout>

เนื่องจากตัว Group ไม่มีการแสดงผลบนหน้าจอจึงสามารถกำหนดความกว้างและความสูงเป็นค่าอะไรก็ได้ (แต่ต้องกำหนด เพราะเป็น Required Attribute) และในการกำหนดว่าจะให้ View ตัวไหนอยู่ภายใต้ Group นั้น ๆ ก็ให้กำหนดผ่าน Attribute ที่ชื่อว่า constraint_referenced_ids แล้วกำหนด View ID ที่ต้องการได้เลย

ในการกำหนด View ID ไม่ต้องใส่ @+id หรือ @id ถ้ามีมากกว่าหนึ่งตัวก็ให้คั่นด้วยเครื่องหมายลูกน้ำ และกำหนด View ID กี่ตัวก็ได้

เมื่อใดก็ตามที่มีการกำหนดค่า Visibility ให้กับ Group ไม่ว่าจะใน Layout XML หรือ Programmatically ก็ตาม ก็จะทำให้ Group ไปสั่ง View ทุกตัวให้ทันที

val group1: Group = /* ... */
/* ... */
group1.visibility = View.GONE

แน่นอนว่าผู้ที่หลงเข้ามาอ่านยังคงกำหนด Visibility ให้กับ View โดยตรงได้เหมือนเดิม และใน ConstraintLayout จะมี Group กี่ตัวก็ได้ขึ้นอยู่กับความต้องการของนักพัฒนา

จะเกิดอะไรขึ้นถ้า View ID อยู่ในหลาย Group

ในการกำหนด View ให้กับ Group ควรแยก View ออกตามแต่ละ Group ให้ชัดเจน ดังนั้นการกำหนดให้ View อยู่ในหลาย ๆ Group จึงไม่สามารถทำได้

ดังนั้นถ้าผู้ที่หลงเข้ามาอ่านกำหนด View ID ตัวเดียวกันในหลาย Group ก็จะมีผลแค่เพียง Group เดียวเท่านั้น โดยอ้างอิงจาก Group ตัวสุดท้ายใน XML

<androidx.constraintlayout.widget.ConstraintLayout 
    ... >
    
    <!-- ... -->
    
    <androidx.constraintlayout.widget.Group
        android:id="@+id/group1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:constraint_referenced_ids="textView1,textView2" />
    
    <androidx.constraintlayout.widget.Group
        android:id="@+id/group2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:constraint_referenced_ids="textView2,textView3" />
    
</androidx.constraintlayout.widget.ConstraintLayout>

จากตัวอย่างจะเห็นว่าเจ้าของบล็อกกำหนด textView2 ถูกกำหนดไว้ใน group1 และ group2 ทั้งคู่ แต่เวลาใช้งานจริง Visibility ของ textView2 จะอ้างอิงจาก group2 เท่านั้น ดังนั้นเมื่อมีการกำหนดค่า Visibility ใน group1 ก็จะไม่มีผลใด ๆ กับ textView2

สรุป

Group เป็นหนึ่งใน Constraint Helper สำหรับ ConstraintLayout ที่มีประโยชน์มากตัวหนึ่ง เพราะบ่อยครั้งนักพัฒนาจะต้องกำหนดค่า Visibility ให้กับ View หลาย ๆ ตัวพร้อมกัน ดังนั้นการใช้คำสั่งเพื่อกำหนดให้กับ View ทีละตัวจึงไม่ตอบโจทย์ซักเท่าไรนัก ซึ่ง Group ก็จะช่วยให้เหลือคำสั่งแค่เพียงบรรทัดเดียวนั่นเอง