功能简介
使用 data binding后,可以直接在Layout中进行数据绑定,无需在findViewById后手工设置数据了.简化的前端的开发负担.且使代码更加清晰.
导入DataBinding
现在android studio最新版本已内置了DataBinding功能.使用时只需要在build.gradle中加入如下代码
<!--加在anroid层级下-->
dataBinding {
enabled = true
}
使用DataBinding.
定义entity
DataBinding实现的功能是将java实体里的数据绑定到Laoyout上,所以在使用前需要定义一下pojo,这里我简单写了个,当做参考
package com.peng.study.android.framework.databinding;
/**
* Created by liupeng on 2016/8/16.
*/
public class UserEntity {
public String name;
public String password;
public UserEntity(String name, String password) {
this.name = name;
this.password = password;
}
public void setName(String name) {
this.name = name;
}
public void setPassword(String password) {
this.password = password;
}
public String getName() {
return name;
}
public String getPassword() {
return password;
}
}
这里的实体现在应该个应用都有的,所以无需对原始代码做调整
修改Layout文件
如需要使用DataBinding,需要对原始的Layout文件进行一下修改,下面先看一个DataBinding的Layout
<?xml version="1.0" encoding="utf-8"?>
<!--DataBinding默认的根-->
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<!--数据名名称及类型-->
<variable
name="user"
type="com.peng.study.android.framework.databinding.UserEntity"></variable>
</data>
<!--原始的根节点-->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<EditText
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@={user.name}" />
<EditText
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@={user.password}" />
<Button
android:id="@+id/button"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Button" />
</LinearLayout>
</layout>
可以看到DataBinding的Layout文件的根节点为layout,下面根了一个data节点,里面是代表数据类型和名称的variable节点,在data节点下面才是原始的根节点
在EdtiText的text的属性是 @={user.name},可以看到我用的是 @= ,这里和绝大多数网上的资料都不一样,这是因为现在DataBinding已实现双向绑定功能.不但可以将实体的里的值直接赋值给Layout,也可以将Layout修改的值传回给实体
实现databinding.
做了上面的操作之后,还是不实能现DataBinding功能,还需要做Activity进行调整.先看代码,
package com.peng.study.android.framework.databinding;
import android.databinding.DataBindingUtil;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import com.peng.study.android.R;
import com.peng.study.android.databinding.DataBindingActivityBinding;
import com.peng.study.android.util.LogUtil;
/**
* DataBinding测试
*/
public class DataBindingActivity extends AppCompatActivity implements View.OnClickListener {
UserEntity user;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//setContenetView改为DataBindingUtil.setContentView,为返回Layout文件名称置换成驼峰后加下Binding后缀的实现类
DataBindingActivityBinding binding = DataBindingUtil.setContentView(this, R.layout.data_binding_activity);
//测试实体
user = new UserEntity("testuser", "123456");
//绑定数据,这里setUser为variable的name属性得来
binding.setUser(user);
//以为做测试双向绑定
View viewById = findViewById(R.id.button);
viewById.setOnClickListener(this);
}
@Override
public void onClick(View view) {
//测试双向绑定
LogUtil.debug(user.getName());
LogUtil.debug(user.getPassword());
}
}
可以看到在onCreate里,原setContentView的方法修改成了DataBindingUtil的setContentView方法,并且返回了回Layout文件名称置换成驼峰后加下Binding后缀的实现类
之后使用这个实现类的的set方法就可以实数据绑定,而且当对EditText修改后,会直接对实体的值进行修改.在Log里输出.
这里的Demo比较简单,就不放演示的截图了