DataBinding的基本使用

DataBinding的基本使用


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 的更多用法以及注意事项。


版权声明:本文为weixin_42985196原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。