文档章节

Android官方数据绑定框架DataBinding(一)

i
 i_love_lu
发布于 2016/03/04 10:29
字数 2284
阅读 581
收藏 0

今天来了解一下android最新给我们带来的数据绑定框架——Data Binding Library。数据绑定框架给我们带来了更大的方便性,以前我们可能需要在Activity里写很多的findViewById,烦人的代码也增加了我们代码的耦合性,现在我们马上就可以抛弃那么多findViewById。说到这里,有人可能会有个疑问:我使用一些注解框架也可以不用findViewById啊,是的,但是注解注定要拖慢我们代码的速度,Data Binding则不会,官网文档说还会提高解析XML的速度,最主要的Data Binding并不是单单减少了我们的findViewById,更多好处请往下看文章。

一、环境 
在开始使用新东西之前,我们需要稍微的配置一下环境,这里要求你的Android Studio版本是1.3+,使用eclipse的同学暂时还没有办法使用该框架,请换用Android Studio。还有,在开始之前,请更新你的Support repository到最新的版本。 
万事俱备,那我们就开始搭配环境!

新建一个project,在dependencies中添加以下依赖

classpath "com.android.databinding:dataBinder:1.0-rc1"

新建module,并且在module的build.gradle文件中添加

apply plugin: 'com.android.application'  
apply plugin: 'com.android.databinding'

ok,到现在为止,我们的环境就准备完毕了,下面我们就开始Data Binding的学习啦。

二、Data Binding尝试 
在代码开始,我们并不直接进入新东西的讲解,而且以一段代码展现Data Binding的魅力。 
首先我们需要一个java bean,很简单,一个学生类。

public class Student {  
    private String name;  
    private String addr;  
  
    public Student() {  
    }  
  
    public Student(String name, String addr) {  
        this.name = name;  
        this.addr = addr;  
    }  
  
    public String getName() {  
        return name;  
    }  
  
    public void setName(String name) {  
        this.name = name;  
    }  
  
    public String getAddr() {  
        return this.addr;  
    }  
  
    public void setAddr(String addr) {  
        this.addr = addr;  
    }  
}

再来看看我们布局文件怎么写:

<layout xmlns:android="http://schemas.android.com/apk/res/android">  
    <data>  
        <variable  
            name="stu"  
            type="org.loader.androiddatabinding.Student" />  
    </data>  
  
    <LinearLayout  
        android:orientation="vertical"  
        android:layout_width="match_parent"  
        android:layout_height="wrap_content">  
        <TextView  
            android:layout_width="wrap_content"  
            android:layout_height="wrap_content"  
            android:text="@{stu.name}"/>  
  
        <TextView  
            android:layout_width="wrap_content"  
            android:layout_height="wrap_content"  
            android:text="@{stu.addr}"/>  
    </LinearLayout>  
</layout>

可以看到我们的xml布局和以前还有有一定的差别的,但是差别也不是很大。 
最后来看看Activity怎么写。

public class MainActivity extends AppCompatActivity {  
  
    @Override  
    protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main);  
        binding.setStu(new Student("loader", "山东莱芜"));  
    }  
}

Activity的代码非常简单,就添加了两行代码,而且,值得注意的是:我们并没有findViewById然后再去setText。 
这段小代码运行的结果大家可能已经猜到了,就是在界面上显示loader山东莱芜两句话。

在看完小实例后,大家是不是感觉棒棒哒? 没有了之前的find控件,没有了setText,Activity代码更加简洁明了! 
下面开始,我们进入Data Binding的学习!

三、 初始Data Binding 
上面的代码算是带领我们进入了Data Binding的世界,那我们先从布局文件开始入手Data Binding吧。再来看看上面的布局文件。

<layout xmlns:android="http://schemas.android.com/apk/res/android">  
    <data>  
        <variable  
            name="stu"  
            type="org.loader.androiddatabinding.Student" />  
    </data>  
    ...  
</layout>

我们的根节点变成了layout,在layout的子节点中分成两部分,第一部分是data节点,第二部分才是我们之前的根节点,在data节点下我们又定义了一个variable, 
从名称上看,这应该是一个变量,变量的名称是stu,类型是org.loader.androiddatabinding.Student,这类似我们在java文件中这么定义:

org.loader.androiddatabinding.Student stu;

ok,这样很好理解了吧,不过这里要写Student完整的包名,一个还好,如果这里我们需要多个Student呢?要累死? NO,NO,NO,我们还可以向写java文件那样导入包。

<layout xmlns:android="http://schemas.android.com/apk/res/android">  
    <data>  
        <import type="org.loader.app2.Student" />  
        <variable  
            name="stu"  
            type="Student" />  
    </data>  
    ...  
</layout>

这样写,就类似于java的

import org.loader.app2.Student;...Student stu;...

既然变量我们定义好了,那该怎么使用呢?还是看上面的xml文件。

<layout xmlns:android="http://schemas.android.com/apk/res/android">  
  ...  
  <LinearLayout  
      android:orientation="vertical"  
      android:layout_width="match_parent"  
      android:layout_height="wrap_content">  
      <TextView  
          android:layout_width="wrap_content"  
          android:layout_height="wrap_content"  
          android:text="@{stu.name}"/>  
  
      <TextView  
          android:layout_width="wrap_content"  
          android:layout_height="wrap_content"  
          android:text="@{stu.addr}"/>  
  </LinearLayout>  
</layout>

恩,注意看两个TextViewandroid:text,它的值是一个以@开始,以{}包裹的形式出现,而内容呢?是stu.name。stu就是我们上面定义的variable
name还记得吗?是我们Student类中的一个变量。其实这里就会去调用stu.getName()方法。 
好了,很快,我们就入门了Data Binding,下面让我们来多定义几个变量试试看。

<layout xmlns:android="http://schemas.android.com/apk/res/android">  
    <data>  
        <import type="org.loader.app2.Student" />  
        <variable  
            name="stu"  
            type="Student" />  
        <variable  
            name="str"  
            type="String"/>  
        <variable  
            name="error"  
            type="boolean"/>  
        <variable  
            name="num"  
            type="int" />  
    </data>  
  
    <LinearLayout  
        android:orientation="vertical"  
        android:layout_width="match_parent"  
        android:layout_height="wrap_content">  
        <TextView  
            android:layout_width="wrap_content"  
            android:layout_height="wrap_content"  
            android:text="@{stu.name}"/>  
        <TextView  
            android:layout_width="wrap_content"  
            android:layout_height="wrap_content"  
            android:text="@{str}"/>  
        <TextView  
            android:layout_width="wrap_content"  
            android:layout_height="wrap_content"  
            android:text="@{String.valueOf(num)}"/>  
    </LinearLayout>  
</layout>

来看看定义的变量,多了好几个,有一个String类型的变量我们并没有导包,这里说明一下,和在java里一样,java.lang包里的类,我们是可以不用导包的,再往下,一个booleanint类型的变量,都是java基本类型的,所以说嘛,在这里定义变量,你就想成是在java里定义就ok。 
再来看看这几个TextView,第二个,我们直接使用@{str}来为android:text设置成上面定义个str的值,继续往下要注意了,我们使用了

android:text="@{String.valueOf(num)}"

来设置了一个int类型的变量,大家都知道我们在给android:text设置int类型的值时一定要转化为String类型,要不它就认为是资源文件了,这里我们还学到了一点,在xml中,我们不仅可以使用变量,而且还可以调用方法!

四、 变量定义的高级部分 
在上面,我们学会了如何去在xml中定义变量,但是不知道你发现没?我们没有定义像ListMap等这样的集合变量。那到底能不能定义呢?答案肯定是可以的,而且定义的方式和我们上面的基本一致,区别就在于我们还需要为它定义key的变量,例如:

<layout xmlns:android="http://schemas.android.com/apk/res/android">  
    <data>  
        <import type="org.loader.app2.Student" />  
        <import type="android.graphics.Bitmap" />  
        <import type="java.util.ArrayList" />  
        <import type="java.util.HashMap" />  
        <variable  
            name="stu"  
            type="Student" />  
        <variable  
            name="str"  
            type="String"/>  
        <variable  
            name="error"  
            type="boolean"/>  
        <variable  
            name="num"  
            type="int" />  
        <variable  
            name="list"  
            type="ArrayList<String>" />  
        <variable  
            name="map"  
            type="HashMap<String, String>" />  
        <variable  
            name="array"  
            type="String[]" />  
  
        <variable  
            name="listKey"  
            type="int" />  
        <variable  
            name="mapKey"  
            type="String" />  
        <variable  
            name="arrayKey"  
            type="int" />  
    </data>  
  
    <LinearLayout  
        android:orientation="vertical"  
        android:layout_width="match_parent"  
        android:layout_height="wrap_content">  
        <TextView  
            android:layout_width="wrap_content"  
            android:layout_height="wrap_content"  
            android:text="@{stu.name}"/>  
        <TextView  
            android:layout_width="wrap_content"  
            android:layout_height="wrap_content"  
            android:text="@{str}"/>  
        <TextView  
            android:layout_width="wrap_content"  
            android:layout_height="wrap_content"  
            android:text="@{String.valueOf(num)}"/>  
        <TextView  
            android:layout_width="wrap_content"  
            android:layout_height="wrap_content"  
            android:text="@{list[listKey]}"/>  
  
        <TextView  
            android:layout_width="wrap_content"  
            android:layout_height="wrap_content"  
            android:text="@{map[`name`]}"/>  
        <TextView  
            android:layout_width="wrap_content"  
            android:layout_height="wrap_content"  
            android:text="@{array[0]}"/>  
    </LinearLayout>  
</layout>

这段代码比较长,但是我们仅关心那几个集合和数组,可以看到我们定义集合和定义普通变量一样,只不过这里我们还指定了一些的泛型,例如:ArrayList&lt;String>。 
下面我们还为下面使用这些集合准备了几个key,也都是变量。 
继续看看怎么使用,和我们在java中使用不同,这里都是以:集合变量名[key]的形式使用,如果你的key是一个字面字符串可以使用反引号,也可以使用转义后的双引号。恩,这里也没有什么可以说的了,大家多看几遍就掌握了,都是概念性的东西,记住就ok。

五、在java代码中使用 
前面定义了这么多变量,但是我们还没有给他们赋值!在哪赋值呢?肯定是在java代码中使用了,大部分情况我们还是在Activity中去使用它,以前我们都是在onCreate方法中通过setContentView去设置布局,但现在不一样了,现在我们是用过DataBindingUtil类的一个静态方法setContentView设置布局,同时该方法会返回一个对象,什么对象?这个对象有点特殊,它是一个自动生成的类的对象,看下面:

@Override  
   protected void onCreate(Bundle savedInstanceState) {  
       super.onCreate(savedInstanceState);  
       ActivityMainBinding binding = DataBindingUtil.setContentView(this,  
               R.layout.activity_main);  
    }

看到ActivityMainBinding了吗?就是它!那自动生成有什么规则了没?当然有了,记好了:

将我们布局文件的首字母大写,并且去掉下划线,将下划线后面的字母大写,加上Binding组成。

看看上面的类,是不是符合这个规则。继续看看这个对象哪来的,是通过

DataBindingUtil.setContentView(this, R.layout.activity_main);

返回的,DataBindingUtil.setContentView的两个参数分别是当前Activity和布局文件。那接下来,就是我们关心的给变量赋值了。

@Override  
protected void onCreate(Bundle savedInstanceState) {  
   ...  
    binding.setStu(new Student("loader"));  
    binding.setStr("string");  
    binding.setError(false);  
  
    ArrayList<String> list = new ArrayList<String>() {  
        {  
            add("arraylist");  
        }  
    };  
    binding.setList(list);  
    binding.setListKey(0);  
  
    HashMap<String, String> map = new HashMap<String, String>() {  
        {  
            put("name", "hashmap");  
        }  
    };  
    binding.setMap(map);  
//        binding.setMapKey("name");  
  
    String[] array = new String[1];  
    array[0] = "array";  
    binding.setArray(array);  
    binding.setArrayKey(0);  
}

一连串的binding.setXXX,这个XXX是什么呢?就是我们在xml中定义的那些变量首字母大写了!也没好好说的吧,多看几遍。

本文转载自:http://blog.csdn.net/jdsjlzx/article/details/48133293

共有 人打赏支持
i
粉丝 1
博文 8
码字总数 4816
作品 0
石家庄
私信 提问
android -------- Data Binding的使用(一)

Google推出自己官方的数据绑定框架Data Binding Library 已经很久了,很多企业也在使用 面试的时候也有问到,所以也去学习了一番,特来分享一下,希望对各位有所帮助 描述: Data Binding 是...

切切歆语
07/18
0
0
Android DataBinding 实战全解

2015年的Google IO大会上,Android 团队发布了一个数据绑定框架(Data Binding Library),官方原生支持 MVVM 模型。数据绑定的概念并不陌生,Web开发中已经很是普遍,因此DataBinding或多或...

sunrongxin.py
2017/07/17
0
0
google data binding框架,与MVVM

> DataBinding 框架 DataBindingDemo- https://github.com/dragonjiang/DataBindingDemo 2015年的Google IO大会上,Android团队发布了一个官方的数据绑定框架(Data Binding Library)。通过......

desaco
09/20
0
0
Android之MVVM架构指南(二):DataBinding

DataBinding 出现的目的旨在取代方法,但是它的功能不仅如此。 配置 在中开启功能 在中启用新的编译器 基本操作 实现一个databinding基本上需要完成三个步骤的工作 1. 创建数据源 即普通的J...

吴七禁
10/22
0
0
使用Kotlin构建更适合Android的MVVM应用程序

简书地址:www.jianshu.com/p/77e42aebd… 概述 说到MVVM,大家都会想起前端的MVVM框架,相较于前端MVVM的火热,它在移动开发领域就不那么热门了。Google在2015年才推出DataBinding框架,起步...

ditclear
2017/11/28
0
0

没有更多内容

加载失败,请刷新页面

加载更多

小白带你认识netty(三)之NioEventLoop的线程(或者reactor线程)启动(一)

在第一章中,我们看关于NioEventLoopGroup的初始化,我们知道了NioEventLoopGroup对象中有一组EventLoop数组,并且数组中的每个EventLoop对象都对应一个线程FastThreadLocalThread,那么这个...

天空小小
今天
3
0
PHP动态扩展Redis模块

查看已有模块 [root@test-a ~]# /usr/local/php/bin/php -m[PHP Modules]bz2Core...zlib[Zend Modules] 下载包,解压,生成configure文件 [root@test-a ~]# cd /usr/local/src/[ro......

野雪球
今天
3
0
在Ignite中使用线性回归算法

在本系列前面的文章中,简单介绍了一下Ignite的机器学习网格,下面会趁热打铁,结合一些示例,深入介绍Ignite支持的一些机器学习算法。 如果要找合适的数据集,会发现可用的有很多,但是对于...

李玉珏
今天
4
0
Mybatis应用学习——简单使用示例

1. 传统JDBC程序中存在的问题 1. 一个简单的JDBC程序示例: public class JDBCDemo {public static void main(String[] args) {Connection con=null;PreparedStatement statemen...

江左煤郎
今天
4
0
使用JavaScript编写iOS应用业务逻辑

JSAUIKitCocoa使你可以使用JavaScript编写对性能要求不高但可能变动性很大的iOS应用的业务逻辑部分,View组件、需要多线程支持的Model等则直接使用原生对象。 编写方式与React Native相似,但...

neal01
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部