JetPack学习笔记之DataBinding(五)
使用ObserverField实现数据的双向绑定,即字段变化时,控件中的内容会随之变化,当控制中的内容变化时,字段的值也会相应的变化。
1、编写ViewModel类
/**
* 项目名称 JetPackPro
* 创建人 xiaojinli
* 创建时间 2020/8/7 4:32 PM
**/
public class LoginModel {
public String userName;
}
2、编写一个用于存放与实现双向绑定相关的业务逻辑类。
/**
* 项目名称 JetPackPro
* 创建人 xiaojinli
* 创建时间 2020/8/7 4:33 PM
**/
public class TwoWayBindingViewModel extends BaseObservable {
private LoginModel loginModel;
public TwoWayBindingViewModel() {
loginModel = new LoginModel();
loginModel.userName = "hello World.";
}
@Bindable
public String getUserName(){
return loginModel.userName;
}
@Bindable
public void setUserName(String name){
if(name != null && !name.equals(loginModel.userName)){
loginModel.userName = name;
notifyPropertyChanged(BR.userName);
}
}
}
注意点有两处,一是在get和set方法上添加@Bindable注解,二是在set方法中判断旧值与新值是否相同,并且在改变旧值时,需要调用notifyPropertyChanged方法。
3、编辑布局文件
<variable
name="loginModel"
type="com.example.jetpackpro.databinding.observerField.TwoWayBindingViewModel" />
.....
<EditText
android:id="@+id/username_et"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@={loginModel.userName}"/>
需要注意的地方是”@“后面加”=“。
5、在Activity中设置变量
twoWayBindingViewModel = new TwoWayBindingViewModel();
binding.setLoginModel(twoWayBindingViewModel);
运行之后可测试效果,当在页面中改变EditText中的内容时,set方法会被调用,当调用set方法时,页面中的内容也会随之变化。
总结
有了DataBinding组件,Activity可以正式告别findViewById了,布局文件中能做的事情也多了,他不仅负责界面的布局,也承担了部分原本属于Activity的工作。通过简单的布局表达式,可以将数据字段和UI控件直接绑定起来,甚至还可以在布局文件中引入工具类进行简单的处理,还可以响应用于的点击事件。
我们可以通过自定义的BindingAdapter,让布局文件通过简单的属性设置,完成复杂的需求,布局文件承担了更多的工作,因而减轻了页面的负担。页面与布局文件之间的耦合度降低了。
此外DataBinding还可以实现双向绑定,可以将UI控件的业务逻辑完全放在ViewModel中进行处理,彻底摆脱页面的束缚,使代码的耦合度进一步降低。