公式の Data Binding Guide#Includesを見てもイマイチぴんと来なかったので実験した見た。
includeする側のレイアウト。
4937/activity_main.xml<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:bind="http://schemas.android.com/apk/res-auto" >
<data>
<variable name="Item2" type="jp.globefish.myapplication.TestData2"/>
<variable name="Item3" type="jp.globefish.myapplication.TestData3"/>
</data>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<include
layout="@layout/inner_layout"
bind:Item1="@{Item2}"
bind:Item3="@{Item3}"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{Item2.name2}"/>
</LinearLayout>
</layout>
includeされる側のレイアウト。
4937/inner_layout.xml<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<variable name="Item1" type="jp.globefish.myapplication.TestData1"/>
<variable name="Item3" type="jp.globefish.myapplication.TestData3"/>
</data>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical" >
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@{Item1.name1}"/>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@{Item3.name3}"/>
</LinearLayout>
</layout>
データを定義。
TestData1を継承した TestData2と単独の TestData3を用意。
4937/TestData1.javapackage jp.globefish.myapplication;
import android.databinding.BaseObservable;
public class TestData1 extends BaseObservable {
public final CharSequence name1 = "name1";
}
4937/TestData2.javapackage jp.globefish.myapplication;
public class TestData2 extends TestData1 {
public final CharSequence name2 = "name2";
}
4937/TestData3.javapackage jp.globefish.myapplication;
import android.databinding.BaseObservable;
public class TestData3 extends BaseObservable {
public final CharSequence name3 = "name3";
}
includeする側の Bindingを作成し、TestData2と TestData3を与える
4937/MainActivity.javapackage jp.globefish.myapplication;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import jp.globefish.myapplication.databinding.ActivityMainBinding;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ActivityMainBinding Binding = ActivityMainBinding.inflate(getLayoutInflater());
Binding.setItem2(new TestData2());
Binding.setItem3(new TestData3());
setContentView(Binding.getRoot());
}
}
すると、includeされる側へ伝わる。
なるほどうまい仕組みだ。*1
ただ、mergeが使えないのは痛いな。
*1 ソースを見るとかなり泥臭いことをしているっぽいのがわかる。