介绍
DataBinding 是google发布的一个数据绑定框架,用于降低布局和逻辑的耦合性,使代码逻辑更加清晰。大量减少 Activity 内的代码,数据能够单向或双向绑定到 layout 文件中,有助于防止内存泄漏,而且能自动进行空检测以避免空指针异常。
实现数据变化自动驱动 UI 刷新的方式有三种:BaseObservable
、ObservableField
、ObservableCollection
。
ObservableField是继承于 Observable
类的类,简单起见可以选择使用 ObservableField
。 可以理解为官方对 BaseObservable
中字段的注解和刷新等操作的封装,官方原生提供了对基本数据类型的封装。对 ObservableField
属性值的改变都会立即触发 UI 刷新,概念上与Observable
区别不大。
效果预览
具体用法
第一步:在app下的build.gradle中启用DataBinding。
android{
...
dataBinding {
enabled true
}
}
第二步:创建实体类Student
com.example.mydemo.entity.Student(包名+类名)
/**
* @data on 2020/8/27 1:43 PM
* @auther armstrong
* @describe 数据绑定示例
*/
public class Student {
public final ObservableField<String> stuName = new ObservableField<>();
public final ObservableField<String> stuAge = new ObservableField<>();
public Student() {
}
}
解析:其中的ObservableField是一个可以被观察的字段,用来代替传统的字段定义+set,get方法。因为它本身就带有set,get方法。
具体用法:实例化的Student对象.字段名.set/get()即可。具体可见下文第三步。
第三步:在xml布局文件中进行vm视图+数据的绑定。
R.layout.activity_case3(layout布局文件)
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
<data>
<variable
name="stu"
type="com.example.mydemo.entity.Student" />
</data>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#fff4f4f4"
android:orientation="vertical"
tools:context=".show.Case3">
<TextView
android:id="@+id/title"
android:layout_width="match_parent"
android:layout_height="40dp"
android:background="@color/colorAccent"
android:gravity="center"
android:textSize="20sp"
android:textColor="@color/white"
android:text="DataBinding示例"
tools:ignore="MissingConstraints" />
<TextView
android:id="@+id/tv_name"
android:layout_width="match_parent"
android:layout_height="40dp"
android:gravity="center"
android:text="@{stu.stuName}"
app:layout_constraintTop_toBottomOf="@id/title" />
<TextView
android:id="@+id/tv_age"
android:layout_width="match_parent"
android:layout_height="40dp"
android:gravity="center"
android:text="@{stu.stuAge}"
app:layout_constraintTop_toBottomOf="@id/tv_name" />
<Button
android:id="@+id/btn_changeData"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="改变数据,更新UI"
app:layout_constraintTop_toBottomOf="@id/tv_age" />
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>
解析:@{stu.stuName}默认会调用类中该字段的get方法。
第四步:在activity中书写业务逻辑代码
/**
* @data on 2020/8/27 11:30 AM
* @auther armstrong
* @describe DataBinding+ObservableField使用 (单向绑定刷新UI)
*/
public class Case3 extends AppCompatActivity {
private ActivityCase3Binding binding;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = DataBindingUtil.setContentView(this,R.layout.activity_case3);
final Student student = new Student();
student.stuName.set("李白");
student.stuAge.set("22");
binding.setStu(student);
binding.btnChangeData.setOnClickListener((View v)->{
student.stuName.set("夏侯惇");
student.stuAge.set("29");
});
}
}
双向数据绑定
双向绑定的意思即为当数据改变时同时使视图刷新,而视图改变时也可以同时改变数据。相比于单向数据绑定,它只多一个"="号。
android:text="@={stu.stuName}"
优缺点
优点:减少了接口数量;告别了繁琐findViewById操作;实现了数据和视图的双向绑定,极大地简化了代码。
缺点:bug难以调试,并且DataBinding目前还存在一些编译问题。
总结
要学好MVVM架构模式,需要先学习好dataBinding和liveData的基础知识。
(1)DataBinding是MVVM数据绑定的工具。
(2)LiveData可以很好的解决MVVM之间的通信问题,并且它可以更好地感知组件的生命周期,能够有效地避免内存泄漏。