書き物

技術とか作った物の話とか愚痴文句感想など

Android で公式の Data Binding 機能を試した

asahiufo/AMK2B · GitHub」を作った時にデータ層の更新が View 側に自動連動される仕組みに触れたのですが、Android でも正式に出来るようになったみたいです。 前まで「今最も注目されている設計手法!MVVM を Android アプリ開発に取り入れてみた (フェンリル | デベロッパーズブログ)」のライブラリでがんばってて、そこそこ便利だったのですが、このライブラリも更新が止まっている状態で、創意工夫で何とか使っている状況・・・。 せっかくなので公式に乗り換えてみます。

基本的な使い方は以下の通り。 [Android] – Data Bindingつかってみた | NET BIZ DIV. TECH BLOG

2015/09/10 時点でのバージョンは以下のようです。 dependencies { classpath ‘com.android.tools.build:gradle:1.3.1’ classpath ‘com.android.databinding:dataBinder:1.0-rc1’ }

とりあえず Activity 自身のプロパティをバインディングしてみます。 レイアウトファイルに Data Binding 用のコードを追加します。

<!-- For Data Binding -->
<data>
    <import type="org.ahiufomasao.android.sample.activities.MainActivity"/>
    <variable name="activity" type="MainActivity"/>
</data>

バインディングするプロパティと View を紐付けている所。

MainActivity.java public class MainActivity extends Activity { private String mTestString;

public String getTestString()
{
    return mTestString;
}

@Override
protected void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);

    // Data Binding 準備
    ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
    binding.setActivity(this);

    mTestString = "testtesttesttest";
}

}

ActivityMainBinding はレイアウトファイルにバインディングの記述をした時点で自動生成されるようですね。 とりあえず AndroidStudio の自動シンタックスチェックは通っているようです。

ところがビルドを通すと・・・

Error:(19, 59) エラー: パッケージorg.ahiufomasao.android.sample.databindingは存在しません Error:(106, 9) エラー: シンボルを見つけられません シンボル: クラス ActivityMainBinding 場所: クラス MainActivity

はああああ!!!???? どこが悪いのか分かりませんが、ActivityMainBinding の自動生成がうまくいっていないようです。 AndroidStudio のシンタックスチェックでは OK ですが、ActivityMainBinding 上で Ctrl + B しても、ActivityMainBinding.java のソースへ飛べませんでした。

だいぶ苦労しましたが、ようやく原因が判明しました。 Android DataBinding導入の第一歩: ButterKnife+ViewHolderパターンを置き換える - Islands in the byte stream こちらの

さっそく個人アプリでも導入してみたところ、ドキュメントそのままだとGoogle Daggerとの相性が悪くてコンパイルが通りませんでした。

のことだと思われます。

早速 apt ‘com.android.databinding:compiler:1.0-rc1’ を追加し、リビルドすると、エラーが消えてバインディングが動きました。

新しい機能にいきなり飛びつくと、こういう人柱経験をするはめになりますね。 ちなみに、lombok の @Getter とかでアクセッサ作ると、コード生成のタイミングのせいか、「アクセッサないで」とエラーが出ました。 ぬぅ・・・