Androidデータバインディングライブラリ: https://developer.Android.com/topic/libraries/data-binding/index.html に基づいてアプリベースを開発しました
class SignInViewModel extends BaseObservable {
@Bindable
public String getLogin() {
return login;
}
@Bindable
public String getPassword() {
return password;
}
}
そして今、私は新しいライブラリからViewModelProvidersを使用したいと思います: https://developer.Android.com/topic/libraries/architecture/guide.html
SignInViewModel signInViewModel = ViewModelProviders.of(this).get(SignInViewModel.class);
どのように組み合わせるのですか?何か案が?またはこれらの2つのライブラリを組み合わせる必要がありますか?
編集
私は次のように変更します:
class SignInViewModel extends ViewModel {
public ObservableField<String> login = new ObservableField<>("");
public ObservableField<String> password = new ObservableField<>("");
}
そして今コンパイルしますが、質問は:それは正しい方法ですか?
これは既知の非互換性です。 BaseObservable
とAndroidViewModel
を同時に拡張できないため、@Bindable
を使用して双方向のデータバインディングを作成することはできません 不可能な*。
これは、Arch Components 1.0 final(データバインディング側)の後で修正されます。
*編集:独自のObservableViewModelを作成できます: https://Gist.github.com/JoseAlcerreca/4b66f9953d50b483d80e6b9ad7172685
質問があったときにこれは存在しなかったかもしれませんが、この記事で説明されている別のオプションがあります: https://medium.com/google-developers/Android-data-binding-observability-9de4ff3fe038 =
基本的に、BaseObservableから拡張する代わりに、implementAndroid.databinding。Observable 。
次のことも行う必要があるため、少し作業が増えます。
この変数をモデルクラスに作成します
private PropertyChangeRegistry registry = new PropertyChangeRegistry();
このようにオーバーライドされたメソッドを実装します
@Override
public void addOnPropertyChangedCallback(OnPropertyChangedCallback callback) {
registry.add(callback);
}
@Override
public void removeOnPropertyChangedCallback(OnPropertyChangedCallback callback) {
registry.remove(callback);
}
すべての「BR」呼び出しを次で置き換えます。
registry.notifyChange(this, BR.bar);
その他はすべて、BaseObservableからの拡張と同じように機能します。したがって、おそらくこれは、おそらく当時は利用できなかった、ホセが示唆していたソリューションであると思います。動作しているようです。
更新:Eugene Brusovが述べたように、データバインディングでLiveDataを使用できるようになりました。これは私が現在行っていることであり、ボイラープレートを少なくすることではるかに簡単になります。 https://developer.Android.com/topic/libraries/data-binding/architecture を参照してください。
Android Studio 3.1 Canary 6( https://androidstudio.googleblog.com/2017/12/Android-studio-31-canary-6-is-now。 html ):
LiveDataオブジェクトをデータバインディング式の監視可能なフィールドとして使用できるようになりました。 ViewDataBindingクラスに、LiveDataオブジェクトの監視に使用する必要がある新しいsetLifecycleメソッドが含まれるようになりました。
詳細とサンプルはこちら Medium post にあります。
これはラッパーを使用して解決することもできます:
class SignInViewModelWrapper extends ViewModel {
public final SignInViewModel model = new SignInViewModel();
}
class SignInViewModel extends BaseObservable {
@Bindable
public String getLogin() {
return login;
}
@Bindable
public String getPassword() {
return password;
}
}
その後、次のようなビューモデルを取得できます。
SignInViewModel signInViewModel = ViewModelProviders.of(this).get(SignInViewModelWrapper.class).model;