Java data binding 使用指南(2024)

154 阅读2分钟

1. build文件

对应module(app module)的build文件加入

android {
	buildFeatures {  
	    dataBinding = true  
	    viewBinding =  true  
	}
}

2. xml文件

2.1 转换xml文件

  1. xml文件首行alt + enter 转换为data binding 文件
  2. 会把当前ConstraintLayout放入一个Layout节点下
  3. 并生成data节点

2.2 插入data节点

  1. 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&lt;String&gt;" />  
</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. 自定义数据

  1. 需要继承BaseObservable
  2. 需要把变量设置为private并设置setters和getters(非必须,为了配合notifyChange())
  3. 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 类找不到

image.png

此时生成的java文件:

image.png

这种错误很难定位,可能的错误:带参数的onClick方法绑定没有声明view参数

android:onClick="@{() -> myclick.onClick(person)}"

改正:

android:onClick="@{(view) -> myclick.onClick(view,person)}"

改正后的生成文件:

image.png