DataBinding参考地址:http://blog.csdn.net/qq285016127/article/details/54835731
什么是DataBinding,我们直接上例子吧:
- 我们在Activity中如果想要获取布局的所有控件,需要一个个控件通过
findVIewById()
,但是使用DataBinding就不需要这么麻烦了,我们可以把布局中的所有控件绑定到DataBinding的子类中,想要获取布局中的哪一个控件,只需要直接通过DataBinding的子类就可以获取到了.
使用DataBinding前的准备工作:
- Android是默认支持DataBinding的,所以只需要在App下的build.gradle文件里面的android标签里配置就可以了
dataBinding{
enabled true;
}
DataBinding的简单使用:
- 布局文件的根标签需要添加一个layout属性,里面只能有一个子控件!!!
<?xml version="1.0" encoding="utf-8"?>
<layout
xmlns:android="http://schemas.android.com/apk/res/android">
<LinearLayout
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<Button
android:id="@+id/but"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="修改"/>
<TextView
android:id="@+id/tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"/>
</LinearLayout>
</layout>
- 逻辑代码中获取获取布局的控件:
- DataBindingUtil: 是DataBinding的一个工具类
- DataBindingUtil.setContentView(this, R.layout.activity_main): 可以把一个布局转换成一个标签对象
- 参数1: 需要一个Activity
- 参数2: 需要转换的布局文件
- setContentView: 默认返回的是一个ViewDataBinding对象,这里回返回一个ActivityMainBinding是因为只要我们的布局文件名字发生变化,那么该对象也会跟着变化
- 我们的所有控件就封装在ActivityMainBinding类中,只要通过该类的对象.控件id就可以了
final ActivityMainBinding mainBinding;
mainBinding = DataBindingUtil.setContentView(this, R.layout.activity_main);
mainBinding.but.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mainBinding.tv.setText("我是天才!!!");
}
});
DataBinding例子2:
- 布局文件
- data标签: 相当于声明数据模块,该模块包含导包 声明变量/对象。
- name: 表明声明一个变量,变量名叫data对象类型是com.lai.www.databinding.DataBean.
- android:text=”@{data.name}”: 表明我们要取出data对象的name属性。
<?xml version="1.0" encoding="utf-8"?>
<layout
xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<!--
这里相对于是创建一个DataBean对象
DataBean bean = null
-->
<variable
name="data"
type="com.lai.www.databinding.DataBean"/>
</data>
<LinearLayout
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:id="@+id/but"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{data.name}"/>
<TextView
android:id="@+id/tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{data.age}"/>
</LinearLayout>
</layout>
- 逻辑代码:
- DataBean bean = new DataBean(): 封装数据的对象
- mainBinding.setData(bean): 把这个对象设置给mainBinding,我们就可以在布局中直接引用bean里面的数据了
ActivityMainBinding mainBinding;
mainBinding = DataBindingUtil.setContentView(this, R.layout.activity_main);
//先创建一个DataBean对象,用来封装数据
DataBean bean = new DataBean();
//把这个对象设置给mainBinding,这样我们就可以在布局文件中直接使用了
mainBinding.setData(bean);
bean.setName("我是天才!!!");
bean.setAge("21");
支持在布局中使用表达式
- 数学 + - / * %
- 字符串连接 +
- 逻辑 && ||
- 二进制 & | ^
- 一元运算 + - ! ~
- 移位 >> >>> <<
- 比较 == > < >= <=
- instanceof
- 分组 ()
- null
- Cast
- 方法调用
- 数据访问 []
- 三元运算 ?:
- 例子:
android:text="@{String.valueOf(index + 1)}"
android:visibility="@{age < 13 ? View.GONE : View.VISIBLE}"
android:transitionName='@{"image_" + id}'