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();
さて、本日はここまでにしておきます。