알고나니 당연한거긴 한데, 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_id
에 inflate
되는 뷰가 아래와 같았고 (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"/>
개발을 하다보면 ViewStub
에 inflate
될 뷰를 코드에서 동적으로 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"/>