Android开发教程 - 使用Data Binding(五)数据绑定

前面我们讲到了Data Binding在Activity中的使用在Fragment中的使用,在两者的布局文件中,都可以绑定数据(对象),本篇文章我们就来介绍数据的绑定。

<data>标签

在这个标签中,我们通常用来做下面的事情:

  • 定义所绑定的数据的名称(变量名)及对应类型
  • 引入页面所需的类

示例如下:

<data>
    <import type="android.view.View" />
    <import type="android.text.TextUtils" />

    <variable name="visible" type="boolean"/>
    <variable name="title" type="String"/>
    <variable name="user" type="cn.examplecode.androiddatabinding.User"/>
</data>

其中"<import/>"标签表示引入一个类,比如上例中引入了View类和一个工具类TextUtils,当然也可以引入你自己的类,比如常量类或者工具类。

下面"<variable/>"标签定义了本页面所需要的各种数据名称或类型,其类型可以是java中的基础类型,或者自定义的类。

设置数据

上面定义了页面中所需要的数据后,下面就需要通过获取到的Binding对象设置这些数据:

mBinding.setVisible(true);
mBinding.setTitle("用户信息");
User user = new User();
user.setName("Steve Jobs");
mBinding.setUser(user);

这里的setXXX()方法也是IDE自动根据<data>标签中的定义自动生成的。

如果写代码过程中发现IDE并没有自动正确生成对应的setXXX()方法,则参考这篇文章:Android Data Binding没有正常生成相关类/方法的解决办法,仅需几步操作即可使IDE正常生成。

在布局中使用这些数据

数据设置完毕以后就可以在页面中使用这些数据了,使用起来也非常方便,比起在java代码中操作,可以省去不少代码。

<TextView
    android:id="@+id/tv_title"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@{title}"
    android:visibility="@{visible ? View.VISIBLE : View.GONE}"
    />

<TextView
    android:id="@+id/tv_username"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@{user.name}"
    />    

请注意上面的代码:

android:text="@{title}"

这一行是设置变量"title"的值到TextView中。

android:visibility="@{visible ? View.VISIBLE : View.GONE}"

这一行是根据变量"visible"的值来控制该TextView的显示与否,注意这里需要在<data>标签中引入android.view.View类,来使用View中的VISIBLE和GONE常量,这里可以使用问号表达式来判断。

android:text="@{user.name}"

user是一个自定义对象,user.name意思是取user对象中的name的值。

User定义如下,注意必须设置getter/setter:

public class User {

    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

##总结
通过本篇文章相信你已经了解如何将数据与View进行绑定,这是Data Binding的核心,也是MVVM架构模式的基础,这里介绍的是比较简单的绑定,后面我们将介绍更加深入的使用,使用这些技术后就会发现Data Binding的强大和高效率。

猜你喜欢

转载自blog.51cto.com/11761032/2173217