如何将架构组件与 android 上的数据绑定相结合?

how to combine Architecture Components with data binding on 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);

如何组合?任何的想法?或者应该将这两个库结合起来?

编辑

我改为:

class SignInViewModel extends ViewModel {
   public ObservableField<String> login = new ObservableField<>("");

    public ObservableField<String> password = new ObservableField<>("");
}

现在可以编译了,但问题是:这样对吗?

这是一个已知的不兼容性。你不能同时扩展 BaseObservableAndroidViewModel,所以你不能使用 @Bindable 使双向数据绑定 不可能 * .

这将在 arch components 1.0 final 之后修复(在数据绑定方面)。

*编辑:您可以制作自己的 ObservableViewModel:https://gist.github.com/JoseAlcerreca/4b66f9953d50b483d80e6b9ad7172685

也许这个在提问的时候不存在,但是这篇文章中解释了另一个选项:https://medium.com/google-developers/android-data-binding-observability-9de4ff3fe038

基本上,您可以 实现 android.databinding.Observable.

而不是从 BaseObservable 扩展

工作稍微多一些,因为您还需要执行以下操作:

  1. 在您的模型中创建此变量class

    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 扩展一样。所以我认为这可能是 Jose 可能一直在暗示的解决方案,当时可能还没有。好像还行。

更新: 正如 Eugene Brusov 所提到的,您现在可以将 LiveData 与数据绑定结合使用。这就是我现在正在做的事情,使用更少的样板文件会容易得多。参见 https://developer.android.com/topic/libraries/data-binding/architecture

这也可以使用包装器解决:

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;

使用 Android Studio 3.1 Canary 6 (https://androidstudio.googleblog.com/2017/12/android-studio-31-canary-6-is-now.html) 是可能的:

You can now use a LiveData object as an observable field in data binding expressions. The ViewDataBinding class now includes a new setLifecycle method that you need to use to use to observe LiveData objects.

您可以在此 Medium post 中找到更多详细信息和示例。