Android Constraintlayout Group设置显示或隐藏无效的解决办法

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的显示或隐藏:

  1. 在xml文件中设置 android:visibilitys属性
  2. 在代码中通过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();

 

点赞