閉じる

データバインディングと include

公式の 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.java
package jp.globefish.myapplication;

import android.databinding.BaseObservable;

public class TestData1 extends BaseObservable {
public final CharSequence name1 = "name1";
}
4937/TestData2.java
package jp.globefish.myapplication;

public class TestData2 extends TestData1 {
public final CharSequence name2 = "name2";
}
4937/TestData3.java
package jp.globefish.myapplication;

import android.databinding.BaseObservable;

public class TestData3 extends BaseObservable {
public final CharSequence name3 = "name3";
}

includeする側の Bindingを作成し、TestData2と TestData3を与える

4937/MainActivity.java
package 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 ソースを見るとかなり泥臭いことをしているっぽいのがわかる。

コメントを残す

メールアドレスが公開されることはありません。必須項目には印がついています *

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)