DataBinding是android官方提供的一个用于将layout和程序进行绑定的工具,使用DataBinding可以轻松地操作layout中的某个控件,如动态改变控件显示的文本,为控件绑定监听事件。不需要每次再通过findViewById方法去获取View,这样一来可以大大减少程序的代码总量,提高代码的可读性。
本文介绍DataBinding的基本使用
1.绑定一个基本控件
DataBinding是一个support library,所以它可以支持所有的android sdk,最低可以到android2.1(API7)使用DataBinding需要Android Gradle插件的支持,版本至少在1.5以上,需要的Android studio的版本在1.3以上。
在Android Studio上使用,需要在module级别的build.gradle上添加对DataBinding的支持,直接在android闭包中添加:
android {
dataBinding {
enabled = true
}
}
使用了DataBinding的layout布局文件的结构和一般的布局文件有所不同,需要遵循规定的布局结构如下:
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<variable name=""
type=""/>
</data>
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
</LinearLayout>
</layout>
其中<data>标签下的内容指定一个要绑定的数据的类型和它的名称,这个类型可以是基本类型也可以是我们自己创建的Java类。而在布局文件xml中通过@{...}的方式实现对于这个变量的绑定或者引用。下面介绍各种情况下的DataBinding绑定。
首先在LinearLayout中建立一个基本的Button控件如下:
<Button
android:id="@+id/mDataBinding"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:text="Button" />
activity中的代码如下所示:
public class DataBindingActivity extends BaseActivity {
private ActivityDataBindingBinding binding;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = DataBindingUtil.setContentView(DataBindingActivity.this,
R.layout.activity_data_binding);
}
public void onClick(View view){
int id = view.getId();
switch(id){
case R.id.mDataBinding:
binding.mDataBinding.setText("没有使用findViewById绑定按钮");
break;
}
}
}
如果我们在layout中遵循了DataBinding的标准形式,那么当我们将Activity创建好时,会自动生成一个名为ActivityXXXBinding的类,我们可以使用这个Binding类来完成一系列的DataBinding操作。首先我们创建一个Binding实例,然后调用DataBindingUtil.setContentView()方法为Binding对象绑定layout。当我们要对Layout中的其他控件进行操作时,都只需要通过Binding提供的方法,而不用每次都使用findViewById()来获取控件了。
这里为上面创建的Button绑定一个监听事件用来响应按钮的点击,可以看到,我们并不需要像传统方法中那样使用button.setOnClickListener(),只需定义一个onClick方法,再到layout中添加一个<data>节点,在节点内部添加<variable>标签,其中type表示这个节点所绑定对象的类型。在xml文件中可以通过@{xxx}的方式来调用data。
<data>
<variable
name="jump"
type="com.xxx.activity.DataBindingActivity" />
</data>
这里为名为jump的变量绑定了DataBindingActivity,这样一来jump就可以在xml中调用DataBindingActivity中的方法啦,比如为按钮设置点击响应,在Button中添加onClick属性:
android:onClick="@{jump::onClick}"
运行程序,点击按钮后响应函数生效,说明按钮和Activity绑定成功。
2.绑定XML中的Variable变量
在<data>中添加两个变量
<variable
name="content"
type="String"/>
<variable
name="enable"
type="boolean"/>
在Button控件中我们就可以调用这两个变量的值
<Button
android:id="@+id/mDataBinding1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="@{jump::onClick}"
android:clickable="@{enable}"
android:text="@{content}" />
再回到Activity中,由于我们已经建立了该layout布局与binding对象的绑定,我们就可以直接通过binding.setXXX动态的去改变还是那个面两个变量的值
binding.setContent("直接为button设置内容");
//按钮可点击
binding.setEnable(true);
3.实体类绑定和事件绑定
<variable
name="userInfo"
type="com.example.model.UserInfo"/>
<variable
name="eventListener"
type="com.example.model.EventListener"/>
<Button
android:id="@+id/mDataBinding2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="@{jump::onClick}"
android:text="@{userInfo.name+userInfo.age}" />
<Button
android:id="@+id/mDataBinding3"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="@{eventListener.click1}"
android:text="@{title1}" />
在Activity的onCreate()内添加如下代码:
UserInfo userInfo = new UserInfo("OceaNier", 10);
binding.setUserInfo(userInfo);
binding.setEventListener(new EventListener() {
@Override
public void click1(View v) {
binding.setTitle1("aaaaaaaaa");
}
});
4.绑定适配器
在ListView的适配器中使用DataBinding
public class MyListViewAdapter<T> extends BaseAdapter {
private LayoutInflater inflater;
private int layoutId;
private int variableId;
private List<T> list;
public MyListViewAdapter(Context context, int layoutId, List<T> list, int resId) {
this.layoutId = layoutId;
this.list = list;
this.variableId = resId;
inflater = LayoutInflater.from(context);
}
@Override
public int getCount() {
return list.size();
}
@Override
public Object getItem(int position) {
return list.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewDataBinding dataBinding;
if (convertView == null) {
dataBinding = DataBindingUtil.inflate(inflater, layoutId, parent, false);
} else {
dataBinding = DataBindingUtil.getBinding(convertView);
}
dataBinding.setVariable(variableId, list.get(position));
return dataBinding.getRoot();
}
}
PS:在RecyclerView中使用DataBinding绑定适配器的方法和在ListView中相似。
5.其他
另外DataBinding还能用来实现自定义属性、代码调用、数据刷新、数据调用等等功能,由于目前没有用到在此不做深入探讨。