ConstraintLayout 내부에서 ViewStub 사용시 주의할 점

봄박뱅·2023년 10월 20일
0

알고나니 당연한거긴 한데, ViewStub 개념 자체가 inflate 대상이 되는 뷰를 가져다 끼우는것.
그래서 아래처럼 ConstraintLayout 내부에 선언한 뷰의 id를 가지고 상대적 위치를 조정하려고 하면 실패한다. (아래에서 view_stub_id)

<ViewStub
    android:id="@+id/view_stub_id"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:layout_constraintTop_toTopOf="parent" />

<androidx.constraintlayout.widget.ConstraintLayout
    android:layout_width="match_parent"
    android:layout_height="0dp"
    app:layout_constraintTop_toBottomOf="@id/view_stub_id"
    app:layout_constraintBottom_toBottomOf="parent"/>

view_stub_idinflate 되는 뷰가 아래와 같았고 (inflated_id_one)

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/inflated_id_one"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

실제 infalte 이후에 LayoutInspector 가지고 살펴보니
inflate 된 뷰는 view_stub_id가 아니라 inflated_id_one을 id로 가지고 있었다.

제대로 조정하고 싶다면, 상대위치 조정에 사용될 id를 inflated_id_one 으로 바꿔야한다.

<ViewStub
    android:id="@+id/view_stub_id"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:layout_constraintTop_toTopOf="parent" />

<androidx.constraintlayout.widget.ConstraintLayout
    android:layout_width="match_parent"
    android:layout_height="0dp"
    app:layout_constraintTop_toBottomOf="@id/inflated_id_one"
    app:layout_constraintBottom_toBottomOf="parent"/>

개발을 하다보면 ViewStubinflate될 뷰를 코드에서 동적으로 layoutResource 값 할당을 통해 설정할 수 있다.
별개의 루트뷰의 id가 같으면 상관없겠지만, 다르다면 이 경우 위에서 상대위치 조정에 사용될 id를 어떻게 해야되는지 고민할 수 있다.
생각해본 해결법은 아래처럼 Barrier를 사용하고, Barrier의 id를 가지고 상대위치 조정에 활용하면 잘 된다.

<androidx.constraintlayout.widget.Barrier
    android:id="@+id/inflate_barrier"
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    app:barrierDirection="bottom"
    app:constraint_referenced_ids="inflated_id_one, inflated_id_two" />

<androidx.constraintlayout.widget.ConstraintLayout
    android:layout_width="match_parent"
    android:layout_height="0dp"
    app:layout_constraintTop_toBottomOf="@id/inflate_barrier"
    app:layout_constraintBottom_toBottomOf="parent"/>
profile
Best Ongoing Man, BOM. 최선의 자세로 살아 가고자 합니다. 모두의 마음에 봄의 씨앗이 자라길

0개의 댓글