web-dev-qa-db-ja.com

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

私はこれを正しく理解しましたか?

41
sandalone

はい、あなたはそれを正しく理解しました。 mergeは、ビューツリーのレベル数を減らすための擬似親要素として使用されます。これをチェックするだけです リンク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>   

<LinearLayout>は、あなたが言及した他のファイルにファイルが含まれている場合、違いはありません。したがって、代わりにmergeを使用することをお勧めします。

XMLでは単一の親要素を使用する必要があり、残りのXML要素をその要素に含める必要があるため、mergeを単一の親要素として使用すると、不要な親レイアウトの追加を回避できます。

コンテンツが含まれているファイルでレイアウトが定義されているのとは異なるレイアウトを適用する場合は、「マージ」を避けてください。

28
xyz

私の理解から、それはマージ要素をビュー階層の上位要素として設定します。インクルードは、ビューグループ全体をそこに配置するだけです。したがって、例を使用すると、ビュー階層は次のようになります。

マージあり:

LinearLayout (root)
|
TextView

含む:

LinearLayout (root)
|
LinearLayout
|
TextView

そのため、ビュー階層に不要な追加のLinearLayoutがあります。ただし、その中間ビューが必要になる場合があります。あなたの場合、両方のLinearLayoutsは同じレイアウトパラメータを持ち、他の違いはないので、そうはしません。

30
onit