如何在安卓上将架构组件与数据绑定相结合?



我开发了基于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;
}
}

现在我想使用新库中的视图模型提供程序: 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 组件 1.0 最终(在数据绑定端)之后修复。

*编辑:您可以制作自己的可观察视图模型:https://gist.github.com/JoseAlcerreca/4b66f9953d50b483d80e6b9ad7172685

也许在提出问题时并不存在,但本文还解释了另一种选择:https://medium.com/google-developers/android-data-binding-observability-9de4ff3fe038

基本上,与其从 BaseObservable 扩展,不如实现android.databinding。可观察

工作量稍大,因为您还需要执行以下操作:

  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。

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

现在,您可以将 LiveData 对象用作数据绑定表达式中的可观察字段。类现在包括一个新的 setLifecycle 方法,您需要使用它来观察 LiveData 对象。

您可以在这篇 Medium 帖子中找到更多详细信息和示例。

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

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;

最新更新