介绍
DataBinding,2015年IO大会介绍的一个框架,是Google对MVVM在Android上的一种实现,可以直接数据绑定到xml中,并实现自动刷新。
好处:
去掉了大部分的UI相关代码(比如findViewById、 setOnClickListener、setText等)
xml变成UI的唯一真实来源,数据绑定也直接发生在xml
配置
首先在配置gradle文件
android {
......
dataBinding{
enabled=true
}
}
使用
布局代码
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
<data>
<import type="com.lisn.mywanandroid.Bean.DataBindingBean" />
<variable
name="dataBean"
type="DataBindingBean" />
<variable
name="listener"
type="com.lisn.mywanandroid.Ui.Activity.DataBindingActivity.TestClickListener"/>
</data>
<android.support.constraint.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="10dp"
tools:context=".Ui.Activity.DataBindingActivity">
<TextView
android:id="@+id/tv1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{dataBean.x2c}"
android:onClick="@{()->listener.onClickListenerBinding()}"
tools:text="@tools:sample/date/hhmm" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{dataBean.xml}"
android:onClick="@{()->listener.onClickListenerBinding()}"
app:layout_constraintTop_toBottomOf="@id/tv1"
tools:text="@tools:sample/date/hhmm" />
</android.support.constraint.ConstraintLayout>
</layout>
使用代码
public class DataBindingActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ViewDataBinding viewDataBinding = DataBindingUtil.setContentView(this, R.layout.activity_data_binding);
DataBindingBean bean = new DataBindingBean();
viewDataBinding.setVariable(BR.dataBean, bean);
bean.setX2c("屌爆了");
TestClickListener clickListener = new TestClickListener();
viewDataBinding.setVariable(BR.listener, clickListener);
}
public static void startActivity(Activity activity) {
activity.startActivity(new Intent(activity,DataBindingActivity.class));
}
public class TestClickListener{
public void onClickListenerBinding(){
Toast.makeText(DataBindingActivity.this, "BindingClick", Toast.LENGTH_SHORT).show();
}
}
}
bean对象
public class DataBindingBean {
public String x2c = "X2C";
public String xml = "XML";
public void setX2c(String x2c) {
this.x2c = x2c;
}
public void setXml(String xml) {
this.xml = xml;
}
}
先看xml的变化,最外层的多出了一个layout标签,然后在layout标签中,还多了一个data标签,在TextView中调用了variable 对应的name的对象的属性和方法。
然后看java代码,setContentView被替换成了DataBindingUtil.setContentView,并且返回了一个ViewDataBinding对象,在这个对象中我们调用了setVariable()来对 xml定义的user和listener进行赋值。
看完代码,我们基本上就了解了最基础的知识:
1、使用DataBinding,要在原来的xml最外层嵌套标签。
2、标签中可以定义这个xml到底绑定了哪些东西。其中定义的肯定是个对象类,name是引用的名字,type对应的具体的类的完成包名+类名。
3、在xml中的view使用定义的类中,语法最外层是 @{},如果调用的属性@{ name.filed}, 如果是方法 @{ () -> name.function()}
4、需要替换setContentView,变为DataBindingUtil.setContentView(),来获得能够操作xml中定义的各种内容。
5、在xml中定义的name对象,会生成类似于R文件的BR文件,通过BR.name 就可以找到对应的绑定内容。