文档章节

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

i
 i_love_lu
发布于 2016/03/04 10:29
字数 2284
阅读 536
收藏 0
点赞 1
评论 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
使用Kotlin构建更适合Android的MVVM应用程序

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

ditclear
2017/11/28
0
0
DataBinding使用指南及todoapp-databinding详解

版权声明:本文为博主原创文章,欢迎大家转载! 转载请标明出处: http://blog.csdn.net/guiying712/article/details/80206037,本文出自:【张华洋的博客】 数据绑定库 数据绑定库是一个支持...

guiying712
05/05
0
0
android仿摩拜单车APP、炫酷RecyclerView、卡片滑动、仿饿了么点餐、自定义索引等源码

Android精选源码 Android自定义索引源码(http://www.apkbus.com/thread-599163-1-1.html) LayoutManager实现的卡片滑动(http://www.apkbus.com/thread-599396-1-1.html) android仿摩拜单车A......

逆鳞龙
05/22
0
0
一篇文章从简单到简单了解dataBinding

通过本文可以了解到的内容: 1.如何使用dataBinding; 2.设置点击事件(含参数的); 3.数据与UI同步更新; 4.基本的dataBinding语法; 5.自定义注解。 订会场,找酒店哥哥 酒店哥哥 按照官网...

鹏小轩
05/22
0
0
用代码手把手教你使用MVVM

源码请点击:github.com/shuaijia/Js… 您还可以关注我的微信公众号——安卓干货营,与我交流和获取更多精彩内容。 概述 说到Android MVVM,就会联想到DataBinding框架。然而两者的概念是不一...

安卓干货营
2017/11/12
0
0
编写RecylerView的Adapter竟然如此简单

告别反复、冗余的自定义Adapter,让开发者的重点落在数据上,做到数据驱动UI 只需要关心Item,编写RecyclerView.Adapter竟然如此简单(重新定义) github: https://github.com/ditclear/Bind...

ditclear
05/27
0
0
使用Kotlin构建MVVM应用程序—第一部分:入门篇

简书地址:www.jianshu.com/p/80926d9e6… 目录 使用Kotlin构建MVVM应用程序—第一部分:入门篇 使用Kotlin构建MVVM应用程序—第二部分:Retrofit及RxJava 使用Kotlin构建MVVM应用程序—第三...

ditclear
2017/11/18
0
0
告别反复、冗余的自定义Adapter

告别反复、冗余的自定义Adapter,让开发者的重点落在数据上,做到数据驱动UI 只需要关心Item,编写RecyclerView.Adapter竟然如此简单(重新定义) github: github.com/ditclear/Bi… 示例 更...

ditclear
05/31
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

istio源码分析之pilot-discovery模块分析

本文分析的istio代码版本为0.8.0,commit为0cd8d67,commit时间为2018年6月18日。 本文为Service Mesh深度学习系列之一: Service Mesh深度学习系列part1—istio源码分析之pilot-agent模块分...

xiaomin0322
4分钟前
0
0
数据库基本操作:增删改查及联表操作

所用软件:SQL Server Management Studio 首先第一步,建立一个表。在这里命名为T1。并在里面填入几条数据。如图: T1 一.查询 查询所有:select * from T1; 按条件查询:select * from T1 ...

小_橙_子
8分钟前
0
0
Crontab作业时间设置

今天,遇到这么一个题目,周一到周五的9:00-16:59之间,每隔两分钟将某个命令运行一次。给的答案是: */2 9-16 * * 1-5 /usr/sbin/somecommand dosomething 乍一看,这个答案不对,应...

大别阿郎
12分钟前
0
0
ES17-JAVA API文档管理

1.保存文档 可以通过json工具把java对象转换成json字符串进行保存,也可以通过内置的帮助类直接构建json格式 /** * 获取客户端 * * @return */public static TransportClie...

贾峰uk
13分钟前
0
0
Python代码规范和命名规范

前言 Python 学习之旅,先来看看 Python 的代码规范,让自己先有个意识,而且在往后的学习中慢慢养成习惯 一、简明概述 1、编码 如无特殊情况, 文件一律使用 UTF-8 编码 如无特殊情况, 文件头...

blackfoxya
16分钟前
0
0
联动滑动之一:NestScrollChild和NestedScrollingParent

NestScrollChild和NestedScrollingParent 吐槽一下开源中国竟然标题字数有限制 由于项目中使用了CoordinateLayout来解决联动以及实现炫酷的UI效果,那么必须就要研究一波源码了,毕竟知其然知...

JerryLin123
33分钟前
1
0
cloudera spark2.2 读写hbase

cloudera spark2.2 读写hbase 例子 host = 'bigdata-03,bigdata-05,bigdata-04'conf = { "hbase.zookeeper.quorum": host, "hbase.mapreduce.inputtable": "student1"}k......

osenlin
38分钟前
0
0
数据库规范化

转载自 一个小时学会MySQL数据库 地址:http://www.cnblogs.com/best/p/6517755.html 截取其中 1.4 部分 用于自己学习使用 感谢作者:张果 1.4、数据库规范化 经过一系列的步骤,我们现在终于...

十万猛虎下画山
38分钟前
0
0
ios逆向之工具篇

Reveal:查看任意app的UI结构 注:1.不越狱的手机,可以用Reveal来查看自己app的UI结构,不能查看其它app的结构。 2.越狱手机上可以查看任意app的UI结构。 IDA:反编译工具 从App Store下载的...

HeroHY
39分钟前
0
0
EOS区块链平台智能合约示例HelloWorld

我们将介绍一个使用EOS智能合约构建hello World的例子。 一般环境设置通过上一篇文章已经说明,这方面的问题大家可以看本博客上一篇文章,本文引用了官方EOS在Git上的示例。 运行nodeos 要通...

笔阁
41分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部