简单使用(只作为view获取)
- build.gradle.kts配置
android {
dataBinding {
enable = true
}
}
- activity注入
//setContentView(R.layout.activity_main)
val binding: ActivityMainBinding = DataBindingUtil.setContentView(this, R.layout.activity_main)
- xml配置(只需要binding组件而不需要binding数据时,可以将<data></data>删除)
- 直接使用binding获取组件,不用再findById()
binding.button.setOnClickListener {
binding.textView.text="Hello"
}
binding组件原理
- 跟入DataBindingUtil.setContentView
- 跟入bindToAddedViews --> bind(component, childView, layoutId)–>sMapper.getDataBinder(bindingComponent, root, layoutId)
- 此时没有设置tag,代码也会自动设置一个tag
- 跟入private ActivityMainBindingImpl(androidx.databinding.DataBindingComponent bindingComponent, View root, Object[] bindings)
- mapBindings(DataBindingComponent bindingComponent, View view,Object[] bindings, IncludedLayouts includes, SparseIntArray viewsWithIds,boolean isRoot) 递归获取组件,存入数组bindings
- 使用父抽象类的初始化方法,将组件绑定在对应的变量上。返回一个绑定了组件的对象。所以可以直接使用对象 . 获取组件。
protected ActivityMainBinding(Object _bindingComponent, View _root, int _localFieldCount,
Button button1, Button button2, LinearLayoutCompat linearLayout, ConstraintLayout main,
TextView textView) {
super(_bindingComponent, _root, _localFieldCount);
this.button1 = button1;
this.button2 = button2;
this.linearLayout = linearLayout;
this.main = main;
this.textView = textView;
}
- 主逻辑流程图:
双向绑定
android:text="@={user.pwd}"
public class User extends BaseObservable {
private String name;
private String pwd;
public User(String name, String pwd) {
this.name = name;
this.pwd = pwd;
}
@Bindable
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
notifyPropertyChanged(BR.name);
}
@Bindable
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
notifyPropertyChanged(BR.pwd);
}
}
此时user和UI中的数据会自动同步更改。
同步原理
user推给UI
notifyPropertyChanged(BR.name);
UI推给user
ex:
mDirtyFlags保证只有修改的值进行推送,
- 初始化:
在绑定类初始化时,mDirtyFlags 被设置为一个初始值,通常为 0,表示所有属性都是“干净”的。 - 设置数据:
当数据源发生变化时,相应的位被设置为“脏”。例如,如果某个属性发生了变化,mDirtyFlags 对应的位会被置为 1。 - 更新视图:
在 executeBindings 方法中,会检查 mDirtyFlags 的值,决定哪些视图需要更新。只有那些相应位被设置为“脏”的视图才会重新绑定数据。