DataBinding 是为了解除 Controller 与 ViewGroup 之间的引用联系
DataBinding 库是一种支持库,借助该库,您可以使用声明性格式(而非程序化地)将布局中的界面组件绑定到应用中的数据源。
布局通常是使用调用界面框架方法的代码在 Activity 中定义的。例如,以下代码调用 findViewById() 来查找 TextView 微件并将其绑定到 viewModel 变量的 userName 属性:
TextView textView = findViewById(R.id.sample_text); textView.setText(viewModel.getUserName());
以下示例展示了如何在布局文件中使用数据绑定库将文本直接分配到微件。这样就无需调用上述任何 Java 代码。请注意赋值表达式中 @{} 语法的使用:
借助布局文件中的绑定组件,您可以移除 Activity 中的许多界面框架调用,使其维护起来更简单、方便。还可以提高应用性能,并且有助于防止内存泄漏以及避免发生 Null 指针异常。
基本使用注意:在许多情况下,ViewBinding 可简化实现,提高性能,提供与 DataBinding 相同的好处。如果您使用 DataBinding 的主要目的是取代 findViewById()调用,请考虑改用 ViewBinding。
- 请在模块的 build.gradle 文件中将 dataBinding 构建选项设置为 true,如下所示:
android {
...
buildFeatures {
dataBinding true
}
}
- 结合 LiveData 实现 MyViewModel:
public class MyViewModel extends ViewModel {
private MutableLiveData likedNumber;
public MutableLiveData getLikedNumber() {
if (likedNumber == null) {
likedNumber = new MutableLiveData<>();
likedNumber.setValue(0);
}
return likedNumber;
}
public void addNumber(int n) {
likedNumber.setValue(likedNumber.getValue()+n);
}
}
- 布局优化
layout
布局根节点必须是 . 同时layout只能包含一个View标签. 不能直接包含
data
标签的内容即 DataBinding 的数据. data标签只能存在一个.
variable
通过标签可以指定类, 然后在控件的属性值中就可以使用
- 极大简化 Activity 中的逻辑
MyViewModel viewModel;
// 当对布局进行优化之后,DataBinding 会根据你的 Activity 类名自动创建对应的 binding 类
ActivityDataBindingBinding binding;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = DataBindingUtil.setContentView(this, R.layout.activity_data_binding);
lv = new ViewModelProvider(this).get(MyViewModel.class);
binding.setData(viewModel);
binding.setLifecycleOwner(this);
}



