본문 바로가기
프로그래밍/Android

FrameLayout & <merge />태그

by Mr-후 2018. 10. 5.
반응형


FrameLayout & <merge />태그 




아이폰 개발을 한지 벌써 8년이 넘었다. 2010년부터 개발 공부를 시작해서 꽤 많은 프로젝트를 수행하면서 참 다양한 일들이 있었는데, 이제 와 안드로이드를 공부하려니 이래 저래 답답한 면이 많다. 


아무것도 모르는 상태에서 안드로이드를 접했다면 어땠을까? 하는 생각이 든다. 

아는게 많아도 병이라, 아이폰에서 구현했던 여러 기능들을 안드로이드에서 해보려니 이리 저리 막히는것이 너무 많다. 


차근차근 맨땅에 헤딩하다보면 자연스레 그 횟수가 줄어 들겠지만 시간이 야속할 따름이고 내 한계에 다다랐음을 알기에 헛웃음 뿐, 그렇다고 손을 놓지는 못하겠으니 또 적고 기록하고 부딪혀볼란다. 


최근 나온 책들에서 안드로이드의 xml에 대해 심도있는 고찰은 없고 사용법에 대한 예제 위주로 보다 보니, 책에 없는 태그는 이해가 어렵고 와 닿지 않는 부분들이 있어 인터넷을 찾아가며 정리를 하고 있다. 


그 중 <merge> 태그에 대한 의문점이 있어 찾아보니 어느정도 이해가 가는 문구들이 있어 정리를 해보고자한다. 

완벽하게 이해가 되지는 않지만 대략적인 개념은 이해가 되었다. 


Use the <merge> tag

The <merge /> tag helps eliminate redundant view groups in your view hierarchy when including one layout within another. For example, if your main layout is a vertical LinearLayout in which two consecutive views can be re-used in multiple layouts, then the re-usable layout in which you place the two views requires its own root view. However, using another LinearLayout as the root for the re-usable layout would result in a vertical LinearLayout inside a verticalLinearLayout. The nested LinearLayout serves no real purpose other than to slow down your UI performance.

To avoid including such a redundant view group, you can instead use the <merge> element as the root view for the re-usable layout. For example:


<merge xmlns:android="http://schemas.android.com/apk/res/android">


    <Button

        android:layout_width="fill_parent"

        android:layout_height="wrap_content"

        android:text="@string/add"/>


    <Button

        android:layout_width="fill_parent"

        android:layout_height="wrap_content"

        android:text="@string/delete"/>


</merge>

Now, when you include this layout in another layout (using the <include/> tag), the system ignores the <merge>element and places the two buttons directly in the layout, in place of the <include/> tag.

For further information related to this topic, see Layout resources.


출처 : https://developer.android.com/training/improving-layouts/reusing-layouts 


가장 첫 줄에 다음과 같이 적혀 있다. 

<merge /> 태그는 레이아웃을 다른 레이아웃에 포함 계층에서 중복되는 그룹을 제거하는 도움이됩니다.


말은 어렵다.


LayoutInflator가 <merge />태그를 만나면, <merge></merge>태그 안에 정의된 children들을 <merge />의 상위(parent)에 붙혀 버린다는 이야기이다. LayoutInflator된 XML Document는 항상 root tag를 필요로 하기 때문에 불필요한 root tag가 생기지 않도록 하기 위해 <merge />를 사용한다고 이해하면 될 것 같다. 


android developers Blog의 글을 참고하면 된다. 


https://android-developers.googleblog.com/2009/03/android-layout-tricks-3-optimize-by.html


<merge />태그가 LayoutInflator를 만나 사용하는 것이 기본 view group의 FrameLayout이라 제목을 FrameLayout & <merge />태그라 정의했는데 FrameLayout이란 레이아웃에 포함된 뷰들을 같은 영역에 겹쳐서 배치할 때 사용하는 레이아웃이다.  레이아웃 자체의 특별한 속성이 없다. 


그래서 LayoutInflator가 <merge />태그를 만나 parent뷰에 붙기전에 FrameLayout뷰 그룹을 가진 상태에서 붙을 경우 불필요한 뷰계층이 생겨나는데 경우에 따라서 원하는 레이아웃으로 구성이 안될 수 도 있기 때문에 정확히 알고 사용하는 것이 바람직하다. 




반응형