タグの主な目的include(私が見ているように)は、開発者が再利用可能なxmlコンポーネントを作成して、同じアクティビティで、またはアプリ内の多くのアクティビティで複数回使用できるようにすることです。その再利用可能なコンポーネントが本当に有用であるためには、それは自己完結型であり、可能な限り最小限の外部接続を備えている必要があります。私の見解では、merge含まれている各レイアウトでタグを使用すると、includeタグ全体の有用性が低下します。これが起こると思う理由の例を次に示します。
ActionBar再利用可能なxmlコンポーネントを実装して、各アクティビティに埋め込むことを検討してください。とが含まれ、水平に配置されますTextView。Buttonこれを行うためのレイアウトは次のようになります。
R.layout.actionbar
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content" >
<TextView
android:id="@+id/actionbar_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<Button
android:id="@+id/actionbar_action"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
ここで、アプリに2つのアクティビティがあるとします。1つはルートビューがLinearLayout(垂直方向)で、もう1つはルートビューがRelativeLayoutです。上記のレイアウトは簡単に含めることができます(必要な場所に配置するだけです)。もちろん、そこからの現在の要素を考慮してLinearLayout、同じことが可能です(たとえば、を設定する必要があることに注意してください(たとえば、複製)含まれているレイアウトのルートから)他の属性が考慮されるようにするためのタグ)。RelativeLayoutRelativeLayoutlayout_width/heightincludelayout_*
今、あなたの提案を考慮に入れてください。レイアウトは次のようになります。
<merge xmlns:android="http://schemas.android.com/apk/res/android" >
<TextView
android:id="@+id/actionbar_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<Button
android:id="@+id/actionbar_action"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</merge>
私たちのレイアウトを見るとActionBar、それほど多くはわかりません。どこかに含まれるべきとがありますTextView。Buttonここで、ルートが垂直方向であるアクティビティについて考えてみLinearLayoutます。レイアウトR.layout.actionbarを単純に含めることはできません。これにより、レイアウトが破損します。レイアウトを希望どおりに表示するには、レイアウトに(水平方向に)ActionBar余分に追加する必要があります。LinearLayoutご覧のとおり、上記の状況(タグなしのレイアウト)ですが、親ルートが垂直方向の場合は常に、merge含まれているレイアウトを水平方向のあるレイアウトでラップすることを忘れないでください。LinearLayoutLinearLayout
ルートがである場合、状況はさらに悪化します。でタグを使用するRelativeLayoutことはできません( RelativeLayoutをマージおよびインクルードで機能させる方法を読むための良い質問ですか? )。繰り返しになりますが、オプションは、タグのない状況にあなたを置くaに埋め込むことです(しかし、今では解決するよりも多くの問題を追加しています)。また、このリンクhttp://code.google.com/p/android/issues/detail?id=2863の最後の部分を読むと、タグの他のバグが明らかになる可能性があります。includemergeRelativeLayoutincludeLinearLayoutmergeinclude
上記の例からわかるように、mergeデフォルトでタグを使用すると、特定の状況で問題が発生する可能性があります。また、現在のシステムは、レイアウトを操作するためのより一貫した方法を表しています(includeルートを使用して通常のレイアウトを作成するのと同じように、タグのレイアウトを作成しますView)。また、mergeタグは最適化であり、パフォーマンスの問題が発生し始めるまで(または、複雑さを犠牲にして、パフォーマンスの最後の低下をすべて絞りたい場合)、最適化を試みる必要はないと思います。ほとんどのアプリは現在のシステムで問題なく動作します。適切な量のビューを備えた3〜4レベルの深さのレイアウトは、merge最適化なしでまったく問題なく動作する可能性があります。
mergeタグのもう1つの問題は、膨らんmerge だときに親にアタッチするために、ルートが根元にある膨らんだレイアウトが必要になることです。レイアウトを膨らませる場合はR.layout.actionbar、親にアタッチする必要があります。
View actionBar = getLayoutInflater().inflate(R.layout.actionbar, root, true);
これが本当の制限であるかどうかはわかりません。まれな状況では、取引を妨げる可能性があります。
include-mergeペアの使用についての私の意見です。