Android

DataBindingとObservableField使用時にハマったこと

結論

public な ObservableField が入ったViewModelクラスを作る際には、get"ObservableField名"のメソッドをクラス内に作ってはいけない

前提

  • Android Studio 2.3.1
  • com.android.tools.build:gradle:2.2.3

問題の起きるコード

ViewModel.java
public class ViewModel {
    public ObservableField<String> text = new ObservableField<>();
    public ObservableLong id = new ObservableLong(0);

    public String getText(){
        return this.text.get();
    }

    public void setText(String text){
        this.text.set(text);
    }

    public Long getId() {
        return this.id.get();
    }

    public void setId(long id) {
        this.id.set(id);
    }
}
layout.xml
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools">

    <data>

        <variable
            name="viewModel"
            type="com.example.ViewModel" />
    </data>

    <FlameLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <com.example.CustomView
            android:id="@+id/custom"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            app:Text="@{viewModel.text}"
            app:Id="@{viewModel.id}" />
    </FlameLayout>
</layout>
BindingAdapter.java
public class BindingAdapters {
    @BindingAdapter({"Text"})
    public static void setCustomViewText(CustomView customView, String text) {
        customView.setText(text);
    }

    @BindingAdapter({"Id"})
    public static void setCustomViewId(CustomView customView, long id) {
        customView.setId(id);
    }
}

起きること

  • 上記のViewModelインスタンスのsetIdメソッドを呼んでもsetCustomViewIdメソッドが呼ばれない

解決法

  • ViewModel.javaからgetTextとgetIdメソッドを削除する

原因

  • ObservableField hogeの値をgetするメソッドの名前をgetHogeにするとなぜかActivityHugaBindingクラスにonChangeHogeViewModelメソッドが作られないなど、自動コード生成の一部に不正が発生し、ObservableFieldの値が更新されてもそれを検知できない