본문 바로가기

Android

[안드로이드]merge태그

<merge /> 를 사용하는 이유

1. 중복되는 코드를 <merge />안에 작성하고 쓰이는 곳에서 <include />로 불러와서 사용한다.

2. 뷰계층을 최적화 시킨다.


<merge /> 태그를 이해하기 위해서는 안드로이드의 뷰 계층에 대해서 알고 있어야 한다.



*안드로이드 스튜디오의 Device Monitor에서 Hierarchy View를 사용하여 본 뷰계층 (출처:보댕님 블로그


1. DecorView : 뷰그룹을 관리하지 않고, 밝기 조도 등을 관리하는 레이아웃

2. LinearLayout : 전체 뷰그룹을 담당하는 이름없는 리니어레이아웃으로 타이틀바 영역과 컨텐츠 영역으로 나뉜다.

3-1. FrameLayout + TextView : 타이틀바를 담당한다.

3-2. FrameLayout : 컨텐츠 영역을 담당한다. (우리가 짜는 실제 레이아웃의 최상단)

여기까지가 안드로이드에서 기본적으로 제공하는 뷰 계층


4. 이후로는 사용자가 Linear나 Relative, Frame등 마음대로 짤 수 있다.


<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.softheaven.firstproject.MainActivity">

<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/imgstartprince"
android:layout_gravity="right"
android:layout_marginTop="31dp"
android:layout_marginRight="13dp"/>

<ImageView
android:id="@+id/start_iv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/imgstartbtn"
android:layout_gravity="bottom|center"
android:layout_marginBottom="10dp"/>

</FrameLayout>


만약 위 코드처럼 사용자단에서 처음으로 생성하는 레이아웃이 FrameLayout일 경우 기본으로 만들어진 FrameLayout과 중복이 되는 경우가 발생한다. (뷰계층의 depth가 깊어지면 퍼포먼스가 떨어진다고 한다.)

이때 <merge>를 쓰게되면 뷰가 보여질때 <merge>는 사라지고 자연스럽게 그 안의 내용이 합쳐지면서 중복이 사라지게 된다.


<?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android">

<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/imgstartprince"
android:layout_gravity="right"
android:layout_marginTop="31dp"
android:layout_marginRight="13dp"/>

<ImageView
android:id="@+id/start_iv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/imgstartbtn"
android:layout_gravity="bottom|center"
android:layout_marginBottom="10dp"/>

</merge>