Data Binding LibraryでHello World

Data Bindingが動作する最低限のコードを書いてみましょう。Data Bindingを利用するまでに次のステップを踏みます。

  • Layout XMLを作成し、Data Binding用の記述を行う
  • Data Bindingに利用するデータとなるクラスを作成する
  • 生成されたBindingクラスを確認する
  • DataBindingUtilクラスを使ってレイアウトを初期化する
  • Bindingクラスに対してバインドするデータをセットする

まずはLayout XMLを作成します。ここでは「activity_main.xml」を作成することとします(リスト4)。

リスト2.4 activity_main.xml

<layout xmlns:android="http://schemas.android.com/apk/res/android">
  <data>
    <variable name="article" type="com.sys1yagi.sample.entities.Article"/>
  </data>

  <LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:padding="16dp">

    <TextView
      android:text="@{article.title}"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"/>

  </LinearLayout>
</layout>

いくつか見慣れない要素がありますね。Data Bindingの為に追加された要素と役割を表1に示します。

表2.1: Data Binding Libraryの為の要素

|名前|説明| |layout|Data Binding Libraryで処理をするレイアウトであることを示すための要素です| |data|レイアウト内で利用する変数を宣言するための親要素です| |variable|変数を宣言する要素です。name属性で変数名を、type属性で型を定義します|

variable要素で宣言した変数はレイアウト上の属性値で利用できます。

リスト2.5 変数を利用する例

android:text="@{article.title}"

リスト5は変数articleのtitleプロパティをandroid:textにセットするという意味になります。

次にvariable要素で宣言していたcom.sys1yagi.sample.entities.Articleクラスを作成しましょう(リスト6)。これは単純なデータを表すクラスです。id、title、description、urlがプロパティです。プロパティはpublicであるかJava Beansのメソッドの命名規則に沿ったgetter、setterを持っている必要があります。Android Studioのジェネレータでgetter、setterを生成するとよいでしょう。

リスト2.6 Article.java

public class Article {
  long id;
  String title;
  String description;
  String url;

  // このメソッドはバインド処理時に使われる
  public String getTitle() {
    return title;
  }
  // コンストラクタや他のgetter、setterは省略
}

この時点でactivity_main.xmlに対応するBindingクラスが生成されており、利用が可能になります。今回のケースだと次のクラスが生成されているはずです。

com.sys1yagi.sample.databinding.ActivityMainBinding

ActivityMainBindingクラスにはactivity_main.xmlで定義したViewや変数、変数のgetter、setter、バインドの為のロジックなどが含まれています。ActivityMainBindingクラスを使ってレイアウトを初期化し、必要な値をセットするとバインドが実行されます。

リスト2.7 MainActivity.java

public class MainActivity extends AppCompatActivity {
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    ActivityMainBinding binding =
     DataBindingUtil.setContentView(this, R.layout.activity_main);

    Article article =
      new Article(1, "Hello World!", "description",
      "http://techbooster.jpn.org/");

    // ここでバインドのロジックが実行される
    binding.setArticle(article);
  }
}

リスト7ではDataBindingUtilクラスを使ってActivityMainBindingクラスのインスタンスを作成しています。DataBindingUtilクラスはData Binding Libraryが提供するユーティリティクラスです。DataBindingUtilクラスのsetContentView()メソッドはBindingクラスの生成とActivityクラスのsetContentView()メソッドをラップしてくれます。activity_main.xmlではarticleという変数を宣言していました。これに対応してActivityMainBindingクラスにはarticleのgetter、setterが生成されています。setArticle()を使ってArticleクラスのインスタンスを渡すと、バインドのロジックが実行されます。アプリケーションを実行すると、TextViewに"Hello World!"という値がセットされた状態で表示されるはずです。

TextViewに"Hello World!"が表示される

Data Bindingの動作に必要な実装は以上です。このようにData Bindingを利用するとView操作にまつわる部分をBindingクラスに委譲できます。Layout XML側にViewとデータの関係を記述することで、コード側ではデータの操作にのみ集中できるようになるわけです。作成した例ではBindingクラスに直接データを渡していますが、後述する自動更新の仕組みを利用するとViewへのデータの反映をさらに抽象化でき、複雑なView操作から開放されます。