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方法时,页面中的内容也会随之变化。