techium

このブログは何かに追われないと頑張れない人たちが週一更新をノルマに技術情報を発信するブログです。もし何か調査して欲しい内容がありましたら、@kobashinG or @muchiki0226 までいただけますと気が向いたら調査するかもしれません。

Data Bindingを使ってみる その4

前回前々回前々々回に引き続き、Data Bindingの話題です。

今回は、前回前々回の記事で作成したHanterクラスを、ObservableFieldで置き換えてみます。
ObservableFieldを使うと、Hanterクラスのようないくつかのプロパティを持つクラスを、より簡潔に記述することができます。

まず、ObservableFieldに置き換える前のHanterクラスは以下でした。
Hanter.java

public class Hanter extends BaseObservable{
    private String name;
    private String gender;

    public Hanter(String name, String gender){
        this.name = name;
        this.gender = gender;
    }

    public String getName() {
        return this.name;
    }

    @Bindable
    public String getGender() {
        return this.gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
        notifyPropertyChanged(monhaan.example.com.monhaan.BR.gender);
    }
}

Activity側での値の扱いは以下のようにしていました。
※レイアウトファイル(activity_main.xml)は特に変更点はありません。 MainActivity.java

public class MainActivity extends AppCompatActivity {

    private Hanter hanter;

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

        ActivityMainBinding binder = DataBindingUtil.setContentView(this, R.layout.activity_main);
        hanter = new Hanter("ハンタくん", "MAN");
        binder.setHanter(hanter);

        binder.btnChangeGender.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                hanter.setGender("WOMAN");
            }
        });
    }
}

ObservableFieldに置き換えると以下のようになります。
Hanter.java

public class Hanter {

    public final ObservableField<String> name = new ObservableField<>();
    public final ObservableField<String> gender = new ObservableField<>();

    public Hanter(String name, String gender) {
        this.name.set(name);
        this.gender.set(gender);
    }
}

MainActivity.java

public class MainActivity extends AppCompatActivity {

    private Hanter hanter;

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

        (・・・略・・・)

        binder.btnChangeGender.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                hanter.gender.set("WOMAN");   // 16行目
                //hanter.setGender("WOMAN");
            }
        });
    }
}

見て分かる通り、Hanterクラスの記述が非常に簡潔になりました。
ObservableFieldは、プロパティへのアクセサを提供してくれるため、わざわざSetter/Getterを書かなくても、MainActivity16行目のように値をプロパティにセットすることが可能です。
また、ObservableFieldクラスのsetメソッド内でnotifyCahnge()を呼んでいるため、notifyPropertyChangedをわざわざ記述する必要もなく、実装漏れを防ぐこともできそうです。

なお、プリミティブ型であれば以下の各クラスが用意されています。
ObservableBoolean
ObservableByte
ObservableChar
ObservableDouble
ObservableFloat
ObservableInt
ObservableLong
ObservableShort
例)

public final ObservableInt id = new ObservableInt();

さて、本日はここまでにしておきます。