JetPack学习笔记之DataBinding(五)

264 阅读2分钟

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中进行处理,彻底摆脱页面的束缚,使代码的耦合度进一步降低。