web-dev-qa-db-ja.com

アーキテクチャコンポーネントをAndroidのデータバインディングと組み合わせる方法

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<>("");
}

そして今コンパイルしますが、質問は:それは正しい方法ですか?

16
LunaVulpo

これは既知の非互換性です。 BaseObservableAndroidViewModelを同時に拡張できないため、@Bindableを使用して双方向のデータバインディングを作成することはできません 不可能な*。

これは、Arch Components 1.0 final(データバインディング側)の後で修正されます。

*編集:独自のObservableViewModelを作成できます: https://Gist.github.com/JoseAlcerreca/4b66f9953d50b483d80e6b9ad7172685

15
Jose Alcérreca

質問があったときにこれは存在しなかったかもしれませんが、この記事で説明されている別のオプションがあります: https://medium.com/google-developers/Android-data-binding-observability-9de4ff3fe038 =

基本的に、BaseObservableから拡張する代わりに、implementAndroid.databinding。Observable

次のことも行う必要があるため、少し作業が増えます。

  1. この変数をモデルクラスに作成します

    private PropertyChangeRegistry registry = new PropertyChangeRegistry();
    
  2. このようにオーバーライドされたメソッドを実装します

    @Override
    public void addOnPropertyChangedCallback(OnPropertyChangedCallback callback) {
        registry.add(callback);
    }
    
    @Override
    public void removeOnPropertyChangedCallback(OnPropertyChangedCallback callback) {
        registry.remove(callback);
    }
    
  3. すべての「BR」呼び出しを次で置き換えます。

    registry.notifyChange(this, BR.bar);
    

その他はすべて、BaseObservableからの拡張と同じように機能します。したがって、おそらくこれは、おそらく当時は利用できなかった、ホセが示唆していたソリューションであると思います。動作しているようです。

更新:Eugene Brusovが述べたように、データバインディングでLiveDataを使用できるようになりました。これは私が現在行っていることであり、ボイラープレートを少なくすることではるかに簡単になります。 https://developer.Android.com/topic/libraries/data-binding/architecture を参照してください。

7
Michael Vescovo

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 にあります。

4
Eugene Brusov

これはラッパーを使用して解決することもできます:

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;
1
user8518198