Data Binding事件绑定
Data Binding
1. 构建环境
在moudle的gradle里面,添加下面代码
dataBinding {
enabled = true
}
2. Data Binding Layout文件
Data Binding layout文件有点不同的是:起始根标签是layout,接下来一个data元素以及一个view的根元素。这个View元素就是你没有使用Data Binding的layout文件的根元素。
<?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">
<data>
<variable
name='user'
type='com.skyrayinstrument.wumeng.app_mvvm.User'/>
</data>
<!--原先的根节点 -->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{user.name}"/>
</LinearLayout>
</layout>
在data内部描述了一个名为user的变量属性,使其可以在这个layout中使用:
<variable
name='user'
type='com.skyrayinstrument.wumeng.app_mvvm.User'/>
在layout的属性表达式写作@{},下面是一个TextView的text设置为user的name属性:
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{user.name}"/>
3. Data对象
public class User {
public String name;
}
从Data Binding的角度来看,TextView中的android:text属性的表达式@{user.name}将访问对象中的name。
4. Binding数据
默认情况下,一个Binding类会基于layout文件的名称而产生,将其转换为Pascal case(首字母大写的命名规范)并且添加"Binding"后缀,上述的layout文件是main_activity.xml,因此生成的类名是MainActivityBinding。此类包含从layout属性到layout的Views中所有的bindings(例如user变量),并且它还知道如何给Binding表达式分配数值。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 没有通过ID找到控件,然后对控件进行操作,只是对field进行操作,就可以改变View的值
ActivityMainBinding binding = DataBindingUtil.setContentView(this,R.layout.activity_main);
User user = new User();
user.name = "张三";
binding.setUser(user);
5. Observable字段
new Thread(new Runnable() {
@Override
public void run() {
SystemClock.sleep(5000);
user.name="李四";
}
}).start();
通过上面的代码,我们修改了user对象的值,但是在UI的显示上并没有起到作用。
所以说,并没有起到双向绑定的目标。
Data Binding的真正能力是当数据变化时,可以通知给你的Data对象。有三种不同的数据变化通知机制:Observable对象,ObservableFields以及Observable collections。
当这些可观察Data对象绑定到UI,Data对象属性的更改后,UI也将自动更新。
6. ObservableFields
ObservableFields是自包含具有单个字段的Observable对象。它有所有基本类型和一个是引用类型。要使用它需要在data对象中创建public final字段。
public class User {
public final ObservableField<String> name = new ObservableField<>();
}
要访问该值,使用set和get方法
ActivityMainBinding binding = DataBindingUtil.setContentView(this,R.layout.activity_main);
final User user = new User();
user.name.set("张三");
binding.setUser(user);