上手くレイアウトを分割・コンポーネント化することで、レイアウトファイル
の可読性や再利用性を向上させることができます。
端的に言えば、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となります。
以上です。