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