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

Lun*_*lpo 15 data-binding android android-databinding

我开发了基于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;
    }
}
Run Code Online (Sandbox Code Playgroud)

现在我想使用新库中的ViewModelProviders:https: //developer.android.com/topic/libraries/architecture/guide.html

SignInViewModel signInViewModel = ViewModelProviders.of(this).get(SignInViewModel.class);
Run Code Online (Sandbox Code Playgroud)

它如何结合?任何的想法?或者应该结合这两个库?

编辑

我改为:

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

    public ObservableField<String> password = new ObservableField<>("");
}
Run Code Online (Sandbox Code Playgroud)

现在编译,但问题是:它是正确的方式?

Jos*_*eca 15

这是一种已知的不兼容性.不能扩展BaseObservable,并AndroidViewModel在同一时间,所以你不能用@Bindable做双向数据绑定不可能*.

这将在arch组件1.0 final(在数据绑定端)之后修复.

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


Mic*_*ovo 7

也许当有人问这并不时存在,但还有另一种选择在这篇文章中解释说:https://medium.com/google-developers/android-data-binding-observability-9de4ff3fe038

基本上不是从BaseObservable扩展,而是可以实现 android.databinding.可观察到的.

由于您还需要执行以下操作,所以工作稍微多一些:

  1. 在模型类中创建此变量

    private PropertyChangeRegistry registry = new PropertyChangeRegistry();
    
    Run Code Online (Sandbox Code Playgroud)
  2. 实现这样的重写方法

    @Override
    public void addOnPropertyChangedCallback(OnPropertyChangedCallback callback) {
        registry.add(callback);
    }
    
    @Override
    public void removeOnPropertyChangedCallback(OnPropertyChangedCallback callback) {
        registry.remove(callback);
    }
    
    Run Code Online (Sandbox Code Playgroud)
  3. 用以下内容替换所有"BR"呼叫:

    registry.notifyChange(this, BR.bar);
    
    Run Code Online (Sandbox Code Playgroud)

其他所有工作与从BaseObservable扩展相同.所以我想也许这就是何塞可能暗中提到的解决方案,当时可能没有.它似乎工作.

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