Android DataBinding学习和实践(一)

841 阅读5分钟

目录

一、简介

二、如何在Android Studio中使用DataBinding

三、DataBinding的表达式语法

1、变量的声明

2、变量的使用

3、变量的赋值

4、变量表达式操作符


一、简介

        在Android实际开发过程中,如果是普通开发模式,那么默认的程序架构是如此的——layout(视图层)、activity(控制层)、数据传输存储类(数据层)。但是不幸的是,基础的layout布局文件作为视图层实在是太弱了,以至于activity必须承担一大部分的视图工作,这就导致了activity在功能不断拓展时体积迅速膨胀起来,代码变得极其难以阅读和维护。为了使Android程序可以很好的使用架构如MVC、MVP、MVVM等等,Google官方推出了DataBinding,即数据绑定机制,它可以将数据直接绑定到视图控件中。

二、如何在Android Studio中使用DataBinding

        Google官方推荐我们在使用时,最好把gradle插件升级到最新版本,这样会有更好的使用体验。当然,你只要是在Android4.0(API 14)以上以及gradle1.5.0以上就能够正常使用。

It's recommended to use the latest Android Plugin for Gradle in your project. However, data binding is supported on version 1.5.0 and higher. For more information, see how to update the Android Plugin for Gradle.

        在Android Studio中使用DataBinding,除了要满足我们上面提到的gradle和Android SDK版本,只需要在app下的build.gradle文件中的android{}中添加buildFeatures{dataBinding true}即可,非常简单。

三、DataBinding的表达式语法

1、变量的声明

        变量的声明很简单,首先你需要把你的布局外面嵌套一层,然后在标签中使用标签声明变量即可,结构如下。

        案例代码形式如下。

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
   <data>
       <variable name="user" type="com.silencer.db.entity.User"/>
   </data>
   <LinearLayout
       android:orientation="vertical"
       android:layout_width="match_parent"
       android:layout_height="match_parent">
       <TextView android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:id="@+id/main_text"
           android:text="@{user.name}"/>
   </LinearLayout>
</layout>

        上面的示例代码虽然很短,但是包含了使用DataBindind的基本元素。首先,作为根标签,包含了布局和数据两个区域。标签声明了一个数据区域,所有的变量声明都需要放在这个地方。声明了一个变量,其中name属性指定了变量名称,type属性指定了变量类型。下面的是activity实际的视图布局。

2、变量的使用

        变量的使用是通过使用@{变量名.字段}或者@{变量名.方法}。多说无益,我们来写个简单的demo实践一下。

由于变量都是使用在控件属性的,因此一定要注意转换成控件属性对应的类型,否则会编译出错

①我们新建一个User的实体类,其中有三个属性,name、age以及married。它们分别是String类型、int类型以及boolean类型。如下。

/**
 * 注意,一定要给所有变量添加Get方法,因为DataBinding是通过getXXX来访问某个属性的。
 * 我个人还会添加set以及无参构造方法,可以使程序更好的适配
 */
public class User {
    private String name;
    private int age;
    private boolean married;

    public User() {
    }

    public User(String name, int age, boolean married) {
        this.name = name;
        this.age = age;
        this.married = married;
    }

    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public boolean isMarried() {
        return married;
    }

    public void setMarried(boolean married) {
        this.married = married;
    }
}

②在布局文件中,声明一个名为user、类型为com.silencer.db.entity.User的变量,这里不贴代码,可以看前面的官方示例代码。

③使用@{user.name}访问user中name属性的值并给TextView赋值,这里是通过getName方法来访问的。

④运行一下程序查看效果,效果如下。

        你会很奇怪,诶,怎么显示的文本时null?别着急,我们还没给它赋值呢。 

3、变量的赋值

        变量的赋值实在加载布局文件的类中实现的(一般在activity),这里我们的布局时MainActivity的布局,所以,我们需要在activity中赋值,步骤如下。

①使用DataBindingUtil的静态方法setContentView来获取绑定对象,这个方法有两个重载,我们一般使用两个参数的。这两个参数分别接收activity对象和布局文件资源id,如下。

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ActivityMainBinding binding = DataBindingUtil
                .setContentView(this,R.layout.activity_main);
        User user = new User("silencer",23,false);
        binding.setUser(user);
    }

如果是fragment、ListView、RecyclerView等控件,应该使用ActivityMainBinding.inflate方法来获取ActivityMainBinding对象。这个留给读者自己来实验。

        这里注意,这个ActivityMainBinding的类,DataBindind自动给我们生成的,在根目录包下的databinding包中,他的名称一般根据布局文件来决定。例如,我们布局文件名称为activity_main.xml,那么它的名称就是ActivityMainBinding,即将布局文件名称下划线去掉,首字母大写加上Bidnging后缀。当然,这个名称我们是可以指定的,这里我们先不做说明。

②生成一个User并通过ActivityMainBinding.setUser方法注入,这个方法也是系统生成的。这个类会生成所有变量的get/set方法,同时还会生成所有有id的控件变量。例如,我们可以使用binding.mainText来获取TextView控件对象。

③再次运行程序看看结果。

        成功显示。

4、变量表达式操作符

        上面我们说过,变量通过@{}来使用。但是我们现在只是使用变量的属性而已,我们还可以使用许多操作符来实现对数据和功能的加工,这里我们举几个说明。

  • +、-、*、/、%

        我们在布局文件中修改这一行代码,然后运行一下。

 android:text='@{user.name+",你好"}'

        其他操作符,类似。 

  • 三元表达符?:

        修改布局文件中这行代码,运行查看结果。

android:text='@{user.name==null?String.valueOf(false):String.valueOf(true)}'

  • 类型判断instanceof

        修改布局文件中这行代码,运行查看结果。

android:text='@{user.name instanceof String?String.valueOf(false):String.valueOf(true)}'

  • 数组访问符[]

        我们再声明一个数组变量,并对它进行赋值。

activity_layout.xml
    ......
    <variable
      name="arr"
      type="String[]" />
    ......

MainActivity.class

    ......
    String[] arr = {"aaa","bbb","ccc","ddd"};
    binding.setArr(arr);
    ......

        修改布局文件的这行代码,运行查看效果。

android:text='@{arr[2]}'

        DataBinding基本知识先介绍到这,之后会给大家带来更高级的用法。

本BLOG为原创文章,未经本人许可,不得用于商业用途。转载请注明出处并告知本人,否则保留追究法律责任的权利。

Android DataBinding学习和实践(二)