일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 재택근무
- 끝말잇기
- 안드로이드
- 소프시스 밤부 좌식 엑슬 테이블
- 한달독서
- 베드테이블
- 면접
- 좌식테이블
- 자취필수템
- 1일1커밋
- T자형인재
- 지지않는다는말
- 한달브런치북만들기
- 커스텀린트
- 소프시스
- 캐치마인드
- 북한살둘레길
- 리얼하다
- 목적 중심 리더십
- 어떻게 나답게 살 것인가
- 목적중심리더십
- 아비투스
- 한단어의힘
- 슬기로운 온라인 게임
- 베드트레이
- 테트리스
- 함수형 프로그래밍
- 브런치작가되기
- 한달어스
- 프래그먼트
- Today
- Total
정상에서 IT를 외치다
[Android, ReUsingLayout] include, viewStub, merge 태그 사용하기 본문
안녕하세요. 블랙진입니다
이번 포스팅은 레이아웃을 좀 더 효과적으로 그릴 수 있는 태그인 include, viewStub 그리고 merge 에 대해 알아보겠습니다.
include
재사용 하고 싶은 컴포넌트를 레이아웃에 넣을 때 include 태그를 사용합니다. 예를 들어서 상단바와 같이 재사용하는 컴포넌트를 적용할 때 유용합니다.
상단바를 include 태그를 사용해서 적용하는 예제를 준비해봤습니다.
include_top_bar.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:background="@color/colorPrimary"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="?android:attr/actionBarSize">
<TextView
android:id="@+id/tvIncludeTopBar"
android:textSize="15sp"
android:layout_centerInParent="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
tools:text="상단바"/>
</RelativeLayout>
위와 같이 actionBarSize 높이에 textView 1개를 가진 레이아웃을 그렸습니다. 이걸 activity_main.xml 에 include 해보겠습니다.
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<include
layout="@layout/include_top_bar"/>
<TextView
android:text="블랙진의 티스토리"
android:layout_margin="50dp"
android:layout_gravity="center"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout>
<include></include> 태그를 사용해 간단히 추가해줄 수 있습니다.
MainActivity.class
TextView tvIncludeTopBar = findViewById(R.id.tvIncludeTopBar);
tvIncludeTopBar.setText("상단바 변경");
include_top_bar.xml 에 선언되어 있는 컴포넌트들은 findViewById 를 통해 사용할 수 있습니다.
VideStub 는 사이즈가 0인 더미 뷰입니다. 기능은 include 와 동일하나 setVisibility(int) 또는 inflate 되었을 때 view 를 그리기 시작합니다. 정리하자면 lazy include 라고 생각하시면 됩니다. include 와 동일한 예제로 보여드리겠습니다.
<ViewStub
android:id="@+id/stub"
android:layout="@layout/include_top_bar"
android:layout_width="match_parent"
android:layout_height="?android:attr/actionBarSize"/>
include 태그만 VIewStub 로 변경했으며 width, height 값을 지정해 주어야 합니다.
ViewStub stub = findViewById(R.id.stub);
View inflated = stub.inflate();
TextView tvIncludeTopBar = inflated.findViewById(R.id.tvIncludeTopBar);
tvIncludeTopBar.setText("상단바 변경");
Activity 에서는 inflate() 함수를 사용해 더미 뷰를 화면에 그려주고 findViewById 사용해 컴포넌트를 불러옵니다.
TextView tvIncludeTopBar = findViewById(R.id.tvIncludeTopBar);
혹은 위와 같이 해주셔도 되지만 이 경우 ViewStub 가 inflate 된 후에 선언을 해주셔야 됩니다. 그렇지 않은 경우 NullPointerException 을 발생시킵니다.
merge
merge 는 include 태그과 함께 쓰이며 더미뷰를 생성해 줍니다. indlude 되었을 때 merge 태그는 무시되고 그 자식 View 들을 <merge/> 태그의 부모 View 에 추가합니다.
merge_button.xml
<merge xmlns:android="http://schemas.android.com/apk/res/android">
<Button
android:id="@+id/btnAdd"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="add"/>
<Button
android:id="@+id/btnDelete"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="delete"/>
</merge>
xml 을 생성하여 2개의 버튼을 만들었습니다. 다른 레이아웃에서 include 하게 되면 merge 태그는 무시되고 button 2개만 보여지게 됩니다. 이를 activity_main 에 적용해 보겠습니다.
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<include
layout="@layout/include_top_bar"/>
<TextView
android:text="블랙진의 티스토리"
android:layout_margin="50dp"
android:layout_gravity="center"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<include
layout="@layout/merge_button"/>
</LinearLayout>
<include></include> 를 사용해 추가해 주었습니다. 그러면 merge 태그는 무시되고 activity_main 에 Button 2개가 추가된 것과 동일합니다.
MainActivity 에서 findViewById 를 통해 merge 태그 안의 뷰들을 불러올 수 있습니다.
findViewById(R.id.btnAdd).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
showToast("add");
}
});
findViewById(R.id.btnDelete).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
showToast("delete");
}
});
정리
뷰의 재활용 및 좀 더 나은 구조의 레이아웃을 그릴 수 있는 3가지 태그에 대해 알아봤습니다.
include - 뷰의 재활용을 통해 유지보수의 이점이 있습니다
viewStub - 자주 사용하지 않은 뷰를 그릴때 지정해 주면 불필요하게 레이아웃을 그릴 필요가 없어 성능 개선에 도움이 됩니다.
merge - 레이아웃을 그릴 때 depth 가 깊어 질수록 성능은 저하됩니다. merge 태그를 사용해 depth 를 줄여 성능을 개선할 수 있습니다.
<참고자료>
'안드로이드' 카테고리의 다른 글
[Android, MVP] 리뷰 받은 MVP 예제 with Room (2) | 2019.04.07 |
---|---|
[Zip, CombineLater, WithLatestFrom] 리액티브 예제 따라하기 (0) | 2019.04.04 |
[Android, Cache, Bitmap] 내부저장소에 비트맵 저장하기 (8) | 2019.04.03 |
[Android, Glide] Glide BitmapTransform 파헤쳐 보자! (2) | 2019.03.26 |
[Android, Handler] Handler 넌 무엇이더냐? (0) | 2019.03.26 |