로 레이아웃 재사용

Android에서는 다양한 위젯을 통해 재사용 가능한 작은 상호작용 요소를 제공하지만, 특수 레이아웃이 필요한 큰 구성요소를 재사용해야 할 수도 있습니다. 전체 레이아웃을 효율적으로 재사용하려면 <include><merge> 태그를 사용하여 다른 레이아웃을 현재 레이아웃 내에 삽입하면 됩니다.

레이아웃을 재사용하면 재사용 가능한 복잡한 레이아웃을 만들 수 있으므로 특히 유용합니다. 예를 들어 예/아니요 버튼 패널 또는 설명 텍스트가 포함된 맞춤 진행률 표시줄이 있습니다. 또한 여러 레이아웃에서 공통으로 사용되는 애플리케이션 요소를 추출하여 별도로 관리한 다음 각 레이아웃에 포함시킬 수도 있습니다. 따라서 맞춤 View를 작성하여 개별 UI 구성요소를 만들 수도 있지만 레이아웃 파일을 재사용하면 더 쉽게 이 작업을 할 수 있습니다.

재사용 가능 레이아웃 생성

재사용할 레이아웃을 이미 알고 있으면 새 XML 파일을 만들고 레이아웃을 정의합니다. 예를 들어 다음은 각 활동에 포함될 제목 표시줄을 정의하는 레이아웃입니다(titlebar.xml).

<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="wrap_content"
    android:background="@color/titlebar_bg"
    tools:showIn="@layout/activity_main" >

    <ImageView android:layout_width="wrap_content"
               android:layout_height="wrap_content"
               android:src="@drawable/gafricalogo" />
</FrameLayout>

루트 View는 이 레이아웃을 추가하는 각 레이아웃에 표시되게 하려는 모양 그대로여야 합니다.

참고: 위 XML의 tools:showIn 속성은 컴파일 중에 삭제되고 Android 스튜디오에서 디자인 시에만 사용되는 특수한 속성으로, 이 파일을 포함하는 레이아웃을 지정하여 상위 요소 레이아웃에 삽입된 상태에서 표시되는 이 파일을 미리 보고 수정할 수 있습니다.

<include> 태그 사용

재사용 가능한 구성요소를 추가하려는 레이아웃 내부에 <include> 태그를 추가합니다. 예를 들어 다음은 위의 제목 표시줄을 포함하는 레이아웃입니다.

레이아웃 파일은 다음과 같습니다.

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/app_bg"
    android:gravity="center_horizontal">

    <include layout="@layout/titlebar"/>

    <TextView android:layout_width="match_parent"
              android:layout_height="wrap_content"
              android:text="@string/hello"
              android:padding="10dp" />

    ...

</LinearLayout>

포함된 레이아웃의 루트 뷰에 사용되는 모든 레이아웃 매개변수(모든 android:layout_* 속성)를 <include> 태그에 지정하여 재정의할 수도 있습니다. 예를 들면 다음과 같습니다.

<include android:id="@+id/news_title"
         android:layout_width="match_parent"
         android:layout_height="match_parent"
         layout="@layout/title"/>

그러나 <include> 태그를 사용하여 레이아웃 속성을 재정의하려면 다른 레이아웃 속성이 적용되도록 android:layout_heightandroid:layout_width를 모두 재정의해야 합니다.

<merge> 태그 사용

<merge> 태그를 사용하면 한 레이아웃을 다른 레이아웃에 포함할 때 뷰 계층 구조에서 중복 뷰 그룹을 제거할 수 있습니다. 예를 들어 기본 레이아웃이 두 개의 연속 뷰를 여러 레이아웃에서 재사용할 수 있는 세로 LinearLayout이면 두 개의 뷰를 배치하는 재사용 가능한 레이아웃에는 자체 루트 뷰가 필요합니다. 그러나 다른 LinearLayout을 재사용 가능한 레이아웃의 루트로 사용하면 세로 LinearLayout 내부에 세로 LinearLayout이 생깁니다. 중첩된 LinearLayout은 UI 성능만 저하시킬 뿐 아무 용도가 없습니다.

이러한 중복 뷰 그룹을 포함하는 것을 방지하려면 재사용 가능한 레이아웃의 루트 뷰로 대신 <merge> 요소를 사용할 수 있습니다. 예를 들면 다음과 같습니다.

<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>

이제 이 레이아웃을 다른 레이아웃에 포함하면(<include> 태그 사용), 시스템에서 <merge> 요소를 무시하고 <include> 태그 대신 두 개의 버튼을 직접 레이아웃에 배치합니다.

이 주제와 관련된 자세한 내용은 레이아웃 리소스를 참고하세요.