DataBinding是实现UI和数据绑定的框架,可以直接在xml中绑定数据并实现一些处理逻辑,做到UI和数据的相互监听,实时动态刷新数据。它的功能强大,可以节省很多手写的代码,而且性能也很好,提高代码的开发效率和后期出现问题跟踪的准确性。
使用
在项目的build.gradle 中添加
android {
...
dataBinding {
enabled = true
}
...
}
最低支持的Android版本是4.0,API 14以上。
用法
一、新建UserModel
public class UserModel extends BaseObservable {
private String name;
private String head;
private String address;
private boolean isShow;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getHead() {
return head;
}
public void setHead(String head) {
this.head = head;
}
@Bindable
public String getAddress() {
return address;
}
//使用@Bindable注释,产生BR.XXX
@Bindable
public void setAddress(String address) {
this.address = address;
notifyPropertyChanged(BR.address);//通知某个变量发生了变化 更新该数据
}
@Bindable
public boolean isShow() {
return isShow;
}
@Bindable
public void setShow(boolean show) {
isShow = show;
}
}
使用@Bindable注释,产生BR.XXX,notifyPropertyChanged(BR.address);通知某个变量发生了变化 更新该数据。
BR.java是类似R.java的资源文件,是 Binding Resources 的缩写,由框架自动生成。
二、在layout中创建activity_user.xml
<?xml version="1.0" encoding="utf-8"?>
<layout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
>
<data>
<import type="android.view.View"/>
<variable
name="user"
type="net.xxx.app.user.model.UserModel " />
</data>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:background="@color/white">
<TextView
android:id="@+id/name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@{user.name}"/>
<TextView
android:id="@+id/address"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@={user.address}"/>
<TextView
android:id="@+id/des"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:visibility="@{user.isShow ? View.VISIBLE : View.GONE}"/>
</LinearLayout>
</layout>
因为创建了 user_activity.xml 所以会自动生成 ActivityUserBinding 类。
我们在xml布局中使实现了数据的绑定和简单的view显示隐藏判断;
android:text="@{user.name}“和android:text=”@={user.address}“的作用是不一样的;android:text=”@={user.address}"支持数据动态刷新的。
三、创建 UserActivity.java 类。
public class UserActivity extends BaseActivity{
private ActivityUserBinding binding;
private UserModel userModel;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//之前activity加载布局是setContentView(this,R.layout.user_activity);
binding = DataBindingUtil.setContentView(this,R.layout.user_activity);
init();
setOnClick();
}
//初始化数据
private void init(){
//假设JSONObject data 是服务端返回的
JSONObject data = new JSONObject();
userModel = JSON.parseObject(data.toJSONString(), UserModel.class);
binding.setCollectionModel(userModel);
}
//设置点击事件
private void setOnClick(){
binding.address.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//模拟点击address后更新改数据
userModel.setAddress("这是修改后的地址");
}
});
}
}
现在我们代码中没有使用传统的findViewById()来查找对应的View,也没有使用三方库butterknife;以前从接口获取数据,然后将数据设置到对应的View上是这样的:
private TextView nameV;
private TextView addressV;
private void init(){
nameV = findViewById(R.id.name);//查找对应的View
addressV = findViewById(R.id.address);//查找对应的View
nameV.setText(userModel.getName());//对View设置数据。
addressV .setText(userModel.address());//对View设置数据。
//模拟点击address后更新改数据
addressV .setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
userModel.setAddress("这是修改后的地址");
addressV .setText(userModel.address());//在对View设置数据。
}
});
}
显然使用DataBinding后我们数据的绑定都是在xml布局中完成的,当数据发生变化时也不需要我们再去对View重新赋值,我们只需要更新数据源即可(UserMode)。
总结
优点:
1、能减少大量的findViewById()以及对view的赋值,可以节省很多手写的代码,而且性能也很好。
2、可以直接在xml中绑定数据并实现一些处理逻辑,实时动态刷新数据。
缺点:
1、layout中的xml布局的复用性会大大降低,一般就是一个activity使用一个xml布局。
2、使用部分属性是需要Android Studio先编译后才会动态生成。
建议:
1、不要拒绝 findViewById
DataBinding 和 findViewById() 并不是互斥的。如果某些情况真的不适合使用DataBinding,那就用回findViewById。
2、xml中的表达式尽量简单
xml 文件中不要出现过于复杂业务逻辑,只出现简单的 UI 相关的表达式,不要以为Data Binding是万能的,而想尽办法把逻辑写在xml中。往往这个时候你就应该将逻辑写在绑定的ViewModel里面。
3、合适的才是最好的
不要强行使用Data Binding。
以后再继续探索Data Binding 的更多用法以及注意事项。