2011/10/30

レイアウトファイルにおけるincludeタグの動作を検証

上手くレイアウトを分割・コンポーネント化することで、レイアウトファイル
の可読性や再利用性を向上させることができます。

端的に言えば、includeタグで別レイアウトファイルを指定すると、
指定したレイアウトファイルの内容で置換されるようになります。

includeタグにはandroid:idを指定することができますので、それ自体にリソ
ースIDを指定することができます。
下記の例をみてます。

layout/main.xml
<?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="match_parent"
    android:orientation="vertical" >
    <include android:id="@+id/includer" layout="@layout/include" />
</LinearLayout>


layout/include.xml
<?xml version="1.0" encoding="utf-8" ?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    >
    <TextView 
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     android:text="@string/hello"/>
</FrameLayout>

ポイントはmain.xmlのinclude要素にリソースID(includer)が指定されていること。
上記の内容で、setContentView(main.xml)とした場合のレイアウト階層をみる
と、include先(include.xml)のFrameLayoutのリソースIDに"includer"が割り
当てられます。


では、include.xmlにあるFrameLayoutが既にリソースID割り当て済みだとした
らどちらが優先されるのでしょうか?下記の内容で検証してみます。

layout/main.xml
<?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="match_parent"
    android:orientation="vertical" >
    <include android:id="@+id/includer" layout="@layout/include" />
</LinearLayout>


layout/include.xml
<?xml version="1.0" encoding="utf-8" ?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/includee"
    >
    <TextView 
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     android:text="@string/hello"/>
</FrameLayout>

ポイントはmainのinclude要素にリソースID"includer"が、include.xmlの
FrameLayout要素にリソースID"includee"が指定されていること。
先の内容では、include要素のリソースIDがinclude先(include.xml)の
FrameLayoutのリソースIDに割り当てられましたが、今回はFrameLayoutに
はすでにリソースID"includee"が割り当てられています。
includerとincludeeどちらが優先されるのでしょうか?

結果は
    includer > includee
となりました。
両方定義されている場合はincluderが優先。
includeeのみ定義されている場合はincludeeとなります。

以上です。