Constraintlayout Group簡介
在開發中,有時候需要同時隱藏或者顯示多個控件,用Group就可以很好的實現,是一個輔助類,不會繪製到屏幕上,也不會展現給用戶。
通過屬性app:constraint_referenced_ids 將一些 View 組成組進行集體操作,最常見的操作是setVisibility
<!--計數Group-->
<androidx.constraintlayout.widget.Group
android:id="@+id/count_group"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:visibility="invisible"
app:constraint_referenced_ids="ac_preview_count_view,img_ac_preview_rec_red"
/>
<cn.iwgang.countdownview.CountdownView
android:id="@+id/ac_preview_count_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="@+id/btn_ac_preview_mode_type_attr"
/>
<View
android:id="@+id/img_ac_preview_rec_red"
android:layout_width="18dp"
android:layout_height="18dp"
app:layout_constraintEnd_toStartOf="@+id/ac_preview_count_view"
app:layout_constraintTop_toTopOf="@+id/btn_ac_preview_mode_type_attr"
android:background="@drawable/shape_rec_red"
android:layout_marginEnd="8dp"
/>
可以通過兩種方式來控制group的顯示或隱藏:
- 在xml文件中設置 android:visibilitys屬性
- 在代碼中通過group.setVisibility()方法來設置
但是我在實踐中發現,當我在代碼中調用group.setVisibility()來顯示或隱藏group中的一組控件時,這個方法並沒有生效。通過查看源碼發現,Group更新他成員的可見性狀態是在 updatePreLayout(),而這個方法最終是在ConstraintLayout中通過updateHierarchy()方法調用的,那麼我們就可以在設置可見性之後再調用group.requestLayout(),而requestLayout()方法會導致View的onMeasure、onLayout、onDraw方法被調用,這樣我們就可以立即改變group中控件的可見性了。代碼如下:
if (recIsClick) {
countGroup.setVisibility(View.VISIBLE);
} else if (recIsClick) {
countGroup.setVisibility(View.INVISIBLE);
}
countGroup.requestLayout();