2012-02-08 2 views
28

<merge>을 올바르게 사용할 수 있는지 이해할 수 있는지 알려주는 사람이 필요합니다.<include> 및 <merge>

그래서, 내가 다른 XML 레이아웃에 포함 할 헤더 레이아웃합니다

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent"> 
      <TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content"   
     android:text="Header text" /> 
</LinearLayout> 

을 그리고 난 다른 XML로 (아주 기본입니다)이 방법을 포함한다 :

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent"> 
       <include android:id="@+id/header" layout="@layout/top" 
      android:layout_width="fill_parent" android:layout_height="wrap_content" 
      /> 
</LinearLayout> 

문제없이 작동합니다. 그러나 코드를 최적화하기 위해 포함 된 레이아웃에서 <merge>을 사용해야합니다. 그래서 top layout는 태그 <LinearLayout>가 없어야하지만, 다음과 같이해야합니다

<merge xmlns:android="http://schemas.android.com/apk/res/android"> 
    <TextView 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content"   
      android:text="Header text" /> 
</merge> 

내가이 올바르게 이해 적이 있습니까?

+1

예. 좋아요. 내 경험에 의하면, 나는 병합 할 필요가 없다. 필자는 텍스트 뷰를 자체 XML 파일에 배치하고 해당 파일을 포함 할 수 없습니다. 병합 할 필요가 없습니다. – AedonEtLIRA

+0

예, 작동하지만 Google 개발자가 그러한 연습을 제안하지 않았기 때문에 ** 그렇게 사용하는 것이 안전합니다 **. 병합 태그를 인식하는 무언가를 변경하기로 결정하면 어떻게 될지 걱정됩니다. – sandalone

+1

@sandalone 여러분은 XML을 새로운 표준으로 업데이트해야 할 모든 것을 좋아합니다. 처음부터 안드로이드에서 많은 감가 상각 된 메소드가 있었기 때문에 이것은 염두에 두어야 할 것이지만 실제로는 문제가 아닙니다. – Jonny2Plates

답변

19

예, 올바르게 이해했습니다. merge은 뷰 부모 트리의 수준 수를 줄이기 위해 의사 부모 요소로 사용됩니다. link 만 확인하면 merge에 대한 아주 좋은 설명이됩니다. 어떤 변화를하지 않는 헤더 파일

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent"> 
       <include android:id="@+id/header" layout="@layout/top" 
      android:layout_width="fill_parent" android:layout_height="wrap_content" 
      /> 
</LinearLayout> 

<LinearLayot>에서
이 파일은 당신이 언급 한 다른 파일에 포함 된 경우. 따라서 대신 merge을 사용하는 것이 좋습니다.
XML에서 단일 상위 요소를 사용해야하고 나머지 XML 요소가 포함되어야하므로 단일 부모 요소로 merge을 사용해야하며 불필요한 상위 레이아웃을 추가하지 않아야합니다.
레이아웃이 콘텐츠를 사용하는 파일에 정의 된 것과 다르게 레이아웃을 적용하려면 '병합'을 피하십시오.

+0

감사합니다. 당신이 제안한 링크가 내 머리 속에 혼란을 일으켰습니다. :) 그건 당신들과 다시 확인하고 싶었습니다. – sandalone

+0

@bergnam : 혼란스럽게해서 죄송합니다. 정말 도움이되었다. 다른 좋은 링크를 발견하면 공유됩니다. – xyz

+0

괜찮습니다. 결국 공식 링크 일 뿐이며 다른 모든 텍스트는이 링크를 기반으로합니다. – sandalone

18

내 이해에서 병합 요소를 뷰 계층 구조의 상위 요소로 설정합니다. Include는 단순히 전체 뷰 그룹을 거기에 넣을 것입니다. 병합와

: 그래서 예를 들어 뷰 계층 구조를 사용하는 것처럼 보일 것으로

LinearLayout (root) 
| 
TextView 

은 다음과 같습니다

LinearLayout (root) 
| 
LinearLayout 
| 
TextView 

그래서 당신은 당신이하지 않는 뷰 계층에서 추가의 LinearLayout이있을 것이다 필요한 것. 그러나 때로는 중간 단계가 필요합니다. 귀하의 경우 LinearLayouts는 동일한 레이아웃 매개 변수를 가지며 다른 차이점이 없으므로 그렇지 않습니다.

+0

좋은 지적이지만 그러한 경우는 드뭅니다. 그것에 대한 Upvote – sandalone

0

<merge /> 태그는 한 레이아웃을 다른 레이아웃에 포함 할 때 뷰 계층의 중복 뷰 그룹을 제거하는 데 도움이됩니다. 예를 들어 주 레이아웃이 두 ​​개의 연속 된 뷰를 여러 레이아웃에서 다시 사용할 수있는 수직 LinearLayout 인 경우 두 개의 뷰를 배치하는 재사용 가능한 레이아웃에는 자체 루트 뷰가 필요합니다. 그러나, 재사용 가능한 레이아웃의 루트로서 다른 LinearLayout를 사용하면 (자), 수직의 LinearLayout 내에 수직의 LinearLayout가됩니다. 중첩 된 LinearLayout은 UI 성능을 저하시키는 것 외의 실제 목적을 수행하지 않습니다.

이러한 중복보기 그룹을 포함하지 않으려면 대신 <merge> 요소를 재사용 가능한 레이아웃의 루트보기로 사용할 수 있습니다. 예를 들면 :

이제
<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"/> 

, 당신은 시스템 요소를 무시하고 대신에, 레이아웃에 직접 두 개의 버튼을 배치 (태그를 사용하여) 다른 레이아웃이 레이아웃을 포함하는 경우 꼬리표.