본문

[2018.07.08] 105. Viewstub 개념과 실습

도입

이번 포스팅에서는 Viewstub의 개념에 대해 정리하고 실습할 예정이다.


개념

(출처 - https://developer.android.com/reference/android/view/ViewStub)

"lazily inflate" 런타임에 layout inflate해 resource를 효율적으로 사용할 수 있다.


실습

Step1. Main Xml 설정

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">
 
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World"
        android:layout_gravity="center"
        android:padding="4dp"
        />
 
    <ViewStub
        android:id="@+id/view_stub"
        android:layout="@layout/inflated_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</LinearLayout>
cs


Step2. inflate될 View Xml 설정

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.CardView
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_height="wrap_content"
    android:layout_width="match_parent"
    android:layout_margin="4dp"
    app:cardElevation="10dp">
 
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">
 
        <ImageView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            app:srcCompat="@mipmap/ic_launcher_round" />
 
        <TextView
            android:id="@+id/tv_real"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:text="This is inflated View" />
 
        <Button
            android:id="@+id/btn_close"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:text="Close" />
    </LinearLayout>
</android.support.v7.widget.CardView>
cs


Step3. MainActivity에서 inflate 및 다양한 설정

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
private fun initView() {
    val rootView = view_stub.inflate()  
    // 여기서 rootView는 cardView
    // view_stub.visibility = View.VISIBLE       
    // 이렇게 inflate가 가능하지만 그렇다면 rootView를 가져 올 수 없다.
    val lp = LinearLayout.LayoutParams(
        LinearLayout.LayoutParams.WRAP_CONTENT,
        LinearLayout.LayoutParams.WRAP_CONTENT
    )
    lp.gravity = Gravity.CENTER
    rootView.layoutParams = lp
 
    rootView.btn_close.setOnClickListener {
        rootView.visibility = View.GONE
    }
}
cs

(view attribute 우선순위 - http://heepie.tistory.com/313)

여기서 추가적으로 알 수 있는 것은 LayoutParams 설정은 Code에서 가능하고 xml값이 code 설정값으로 대체 된다.

(사실 당연한 것이고 Code에서 값은 runtime에 적용되기 때문에 당연한 것이다.)



스크린 샷



#viewstub #viewstub 개념 

공유

댓글