如何将架构组件与 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<>("");
}
现在可以编译了,但问题是:这样对吗?
这是一个已知的不兼容性。你不能同时扩展 BaseObservable
和 AndroidViewModel
,所以你不能使用 @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 扩展
工作稍微多一些,因为您还需要执行以下操作:
在您的模型中创建此变量class
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 扩展一样。所以我认为这可能是 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 中找到更多详细信息和示例。
我已经基于 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<>("");
}
现在可以编译了,但问题是:这样对吗?
这是一个已知的不兼容性。你不能同时扩展 BaseObservable
和 AndroidViewModel
,所以你不能使用 @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 扩展工作稍微多一些,因为您还需要执行以下操作:
在您的模型中创建此变量class
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 扩展一样。所以我认为这可能是 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 中找到更多详细信息和示例。