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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章