DataBinding 是谷歌官方发布的一个框架,顾名思义即为数据绑定,是 MVVM 模式在 Android 上的一种实现,用于降低布局和逻辑的耦合性,使代码逻辑更加清晰。MVVM 相对于 MVP,其实就是将 Presenter 层替换成了 ViewModel 层。DataBinding 能够省去我们一直以来的 findViewById() 步骤,大量减少 Activity 内的代码,数据能够单向或双向绑定到 layout 文件中,有助于防止内存泄漏,而且能自动进行空检测以避免空指针异常
虽然dataBinding使用起来可能会有一些坑,比如找不到文件之类的,但是既然是google发布的。我们应当看看。
1、开启配置
如果想使用dataBinding,首先,在 build.gradle 文件中开启databinding的使用:
android{
...
dataBinding {
enabled = true;
}
}
2、使用方法
2.1 单项绑定
其次就是在xml布局文件中把根布局设为,且规则如下:
使用 DataBinding 必须要使用 这个标签作为 xml 的根部局
所有 DataBinding 的内容都写在 标签内
是导入所使用的对象的类型
是具体声明一个数据对象, 是这个对象的名字, 是这个对象的类型, 可以有多个
使用 @{ } / @{book.price} 的方式可以把这个声明出来的数据对象的莫个数据设置给我们的 view
具体使用如下:
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<data>
<variable
name="bindingEntity"
type="com.example.databinding.model.BindingEntity" />
</data>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.databinding.TestActivity">
<TextView
android:id="@+id/tv_test"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{bindingEntity.name}"
android:textSize="20sp"
tools:text="zhangsan" />
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>
< variable>标签下的name为自定义model的名称,type为model的具体路径。
还有一种使用 < import> 标签的定义方法如下:
<data>
<import type="com.example.databinding.model.BindingEntity"/>
<variable name="bindingEntity" type="BindingEntity"></variable>
</data>
此处格式设置完毕后。即可在xml中以@{xxx.xxx}来绑定data,如下:
<TextView
android:id="@+id/tv_test"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{bindingEntity.name}"
android:textSize="20sp"
tools:text="test" />
到此。并不算结束。还需要在activity中DataBindingUtil.setContentView来绑定。
如下:
class TestActivity : AppCompatActivity() {
lateinit var binding: ActivityTestBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = DataBindingUtil.setContentView(this, R.layout.activity_test)
val entity = BindingEntity()
entity.name = "张三"
entity.age = "20"
binding.bindingEntity = entity
//用binding获取View,在java中可以不用注解,依然省略findViewById
binding.tvTest.setOnClickListener{
Toast.makeText(this,"test",Toast.LENGTH_SHORT).show()
}
}
}
2.2 双向绑定
DataBinding的本身是对View层状态的一种观察者模式的实现,通过让View与ViewModel层可观察的对象(比如LiveData)进行绑定,当ViewModel层数据发生变化,View层也会自动进行UI的更新。
前面是DataBinding最基础的用法,即 单向绑定 ,其优势在于,将View层抽象为一个纯Java的可观察者——这意味着ViewModel层相关代码是完全可直接用于进行 单元测试。
但实际的开发中,单向绑定并非是足够的,在一些特定的场景,我们也需要用到 双向绑定。
xml用法
只需要在xml赋值时改为 @={xxx.xxx} 即可,代码如下:
android:text="@={bindingEntity.name}"
Observable Binding 用法
这个方法需要改在model,依然非常简单,需要让model继承BaseObservable,且在get方法中实现 @Bindable 和set方法中使用notifyPropertyChanged 方法,如下:
public class BindingEntity extends BaseObservable{
private String name;
@Bindable
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
notifyPropertyChanged(BR.name);
}
}
注意: BR是编译阶段生成的一个类,功能与 R.java 类似,用 @Bindable标记过 getter方法会在BR中生成一个静态常量。
到此,DataBinding的基本使用就讲解完成了。很简单吧?!