Data Binding事件绑定

2019-03-06  本文已影响0人  努力生活的西鱼

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);
上一篇下一篇

猜你喜欢

热点阅读