我开发了基于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<>("");
}
现在编译,但问题是:这是正确的方式吗?
这是一个已知的不兼容。不能同时扩展BaseObservable
和AndroidViewModel
,因此不能使用@Bindable
使双向数据绑定变得不可能*。
这将在 arch 组件 1.0 最终(在数据绑定端)之后修复。
*编辑:您可以制作自己的可观察视图模型:https://gist.github.com/JoseAlcerreca/4b66f9953d50b483d80e6b9ad7172685
也许在提出问题时并不存在,但本文还解释了另一种选择:https://medium.com/google-developers/android-data-binding-observability-9de4ff3fe038
基本上,与其从 BaseObservable 扩展,不如实现android.databinding。可观察。
工作量稍大,因为您还需要执行以下操作:
在模型类中创建此变量
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 对象用作数据绑定表达式中的可观察字段。类现在包括一个新的 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;