AndroidX库包含架构组件,您可以使用它来设计健壮,可测试和可维护的应用程序。 数据绑定库可与架构组件无缝协作,进一步简化UI的开发。 应用程序中的布局可以绑定到体系结构组件中的数据,这些数据已经帮助您管理UI控制器生命周期并通知数据中的更改。
此页面显示如何将架构组件合并到您的应用程序,以进一步增强使用数据绑定库的好处。
一、使用LiveData通知UI有关数据更改的信息
您可以使用LiveData对象作为数据绑定源,以自动通知UI有关数据更改的信息。 有关此体系结构组件的更多信息,请参阅LiveData概述。
与实现Observable的对象(例如可观察字段)不同,LiveData对象了解订阅数据更改的观察者的生命周期。 这些知识带来了许多好处,使用LiveData的优势对此进行了解释。 在Android Studio 3.1及更高版本中,您可以使用数据绑定代码中的LiveData对象替换可观察字段。
要将LiveData对象与绑定类一起使用,需要指定生命周期所有者以定义LiveData对象的范围。 以下示例在实例化绑定类之后将活动指定为生命周期所有者:
class ViewModelActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
// Inflate view and obtain an instance of the binding class.
UserBinding binding = DataBindingUtil.setContentView(this, R.layout.user);
// Specify the current activity as the lifecycle owner.
binding.setLifecycleOwner(this);
}
}
您可以使用ViewModel组件(如使用ViewModel中所述来管理与UI相关的数据),以将数据绑定到布局。 在ViewModel组件中,您可以使用LiveData对象转换数据或合并多个数据源。 以下示例显示如何转换ViewModel中的数据:
class ScheduleViewModel extends ViewModel {
LiveData username;
public ScheduleViewModel() {
String result = Repository.userName;
userName = Transformations.map(result, result -> result.value);
}
二、使用ViewModel管理与UI相关的数据
数据绑定库与ViewModel组件无缝协作,后者显示布局观察到的数据并对其更改做出反应。 将ViewModel组件与数据绑定库一起使用,可以将UI逻辑从布局移动到组件中,这些组件更易于测试。 数据绑定库可确保在需要时绑定和取消绑定数据源。 剩下的大部分工作都在于确保您公开正确的数据。 有关此体系结构组件的更多信息,请参阅ViewModel概述。
要将ViewModel组件与数据绑定库一起使用,必须实例化从Viewmodel类继承的组件,获取绑定类的实例,并将ViewModel组件分配给绑定类中的属性。 以下示例显示如何将该组件与库一起使用:
class ViewModelActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
// Obtain the ViewModel component.
UserModel userModel = ViewModelProviders.of(getActivity())
.get(UserModel.class);
// Inflate view and obtain an instance of the binding class.
UserBinding binding = DataBindingUtil.setContentView(this, R.layout.user);
// Assign the component to a property in the binding class.
binding.viewmodel = userModel;
}
}
在布局中,使用绑定表达式将ViewModel组件的属性和方法分配给相应的视图,如以下示例所示:
<CheckBox
android:id="@+id/rememberMeCheckBox"
android:checked="@{viewmodel.rememberMe}"
android:onCheckedChanged="@{() -> viewmodel.rememberMeChanged()}" />
三、使用Observable ViewModel可以更好地控制绑定适配器
您可以使用实现Observable的ViewModel组件来通知其他应用程序组件有关数据更改的信息,类似于使用LiveData对象的方式。
在某些情况下,您可能更喜欢使用ViewModel组件来实现Observable接口而不是使用LiveData对象,即使您丢失了LiveData的生命周期管理功能。使用实现Observable的ViewModel组件可以更好地控制应用程序中的绑定适配器。例如,此模式使您可以在数据更改时更好地控制通知,还允许您指定自定义方法以在双向数据绑定中设置属性的值。
要实现可观察的ViewModel组件,必须创建一个继承自ViewModel类并实现Observable接口的类。当观察者使用addOnPropertyChangedCallback()和removeOnPropertyChangedCallback()方法订阅或取消订阅通知时,您可以提供自定义逻辑。您还可以提供在notifyPropertyChanged()方法中属性更改时运行的自定义逻辑。以下代码示例演示如何实现可观察的ViewModel:
/**
* A ViewModel that is also an Observable,
* to be used with the Data Binding Library.
*/
class ObservableViewModel extends ViewModel implements Observable {
private PropertyChangeRegistry callbacks = new PropertyChangeRegistry();
@Override
protected void addOnPropertyChangedCallback(
Observable.OnPropertyChangedCallback callback) {
callbacks.add(callback);
}
@Override
protected void removeOnPropertyChangedCallback(
Observable.OnPropertyChangedCallback callback) {
callbacks.remove(callback);
}
/**
* Notifies observers that all properties of this instance have changed.
*/
void notifyChange() {
callbacks.notifyCallbacks(this, 0, null);
}
/**
* Notifies observers that a specific property has changed. The getter for the
* property that changes should be marked with the @Bindable annotation to
* generate a field in the BR class to be used as the fieldId parameter.
*
* @param fieldId The generated BR id for the Bindable field.
*/
void notifyPropertyChanged(int fieldId) {
callbacks.notifyCallbacks(this, fieldId, null);
}
}
网友评论