1. build文件
对应module(app module)的build文件加入
android {
buildFeatures {
dataBinding = true
viewBinding = true
}
}
2. xml文件
2.1 转换xml文件
- xml文件首行alt + enter 转换为data binding 文件
- 会把当前ConstraintLayout放入一个Layout节点下
- 并生成data节点
2.2 插入data节点
- data节点加入value节点,指明名字和类型
<data>
<variable
name="name"
type="String" />
<variable
name="like"
type="String" />
<variable
name="person"
type="com.example.javalearningexamples.Person" />
<variable
name="myclick"
type="com.example.javalearningexamples.MyClick" />
<variable
name="text"
type="androidx.databinding.ObservableField<String>" />
</data>
2.3 value和控件绑定
2.3.1 控件显示数据
android:text="@{person.name}"
android:text="@{text}"
2.3.2 控件修改数据
android:text="@={text}"
2.3.3 onClick方法
先声明一个类,实现onClick方法
public class MyClick{
public void onClick(View view, Person person){
Log.i("Tag",person.getName()+" pressed!!!!!");
person.setName("Pressed");
}
}
把Click类加入variable节点,最后再onClick方法绑定中调用Click类的方法(用lambda表达式)
<variable
name="myclick"
type="com.example.javalearningexamples.MyClick" />
android:onClick="@{(view) -> myclick.onClick(view,person)}"
3. Activity文件
activity类中声明ActivityMainBinding(MainActivity->Main,其他名称类似)
ActivityDataBindingBinding binding;
在onCreate函数中实例化
binding = DataBindingUtil.setContentView(this, R.layout.activity_data_binding);
基本类型
ObservableField<String> text = new ObservableField<String>();
text.set("This is a text");
绑定数据和xml文件中的variable
binding.setText(text);
4. 自定义数据
- 需要继承BaseObservable
- 需要把变量设置为private并设置setters和getters(非必须,为了配合notifyChange())
- setter方法中调用notifyChange,使每次改变变量都能通知UI更新。
public class Person extends BaseObservable {
private String name;
private String like;
public Person(String name, String like) {
this.name = name;
this.like = like;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
notifyChange();
}
public String getLike() {
return like;
}
public void setLike(String like) {
this.like = like;
notifyChange();
}
}
5. 常见Bug
5.1 xml文件注解错误
会导致build过程无法生成相应的文件,编译器报错: com.example.javalearningexamples.databinding.ActivityDataBindingBindingImpl 类找不到
此时生成的java文件:
这种错误很难定位,可能的错误:带参数的onClick方法绑定没有声明view参数
android:onClick="@{() -> myclick.onClick(person)}"
改正:
android:onClick="@{(view) -> myclick.onClick(view,person)}"
改正后的生成文件: