Android数据绑定框架DataBinding用法

Android数据绑定框架DataBinding用法

    【尊重原创,转载请注明出处http://blog.csdn.net/guyuealian/article/details/51953749
一、数据绑定框架DataBinding介绍:
     Android的新框架DataBinding给我们带来了很大的方便,以前可能需要在每个Activity里写很多的findViewById,不仅麻烦,还增加了代码的耦合性;而使用DataBinding,就可以抛弃findViewById。Data Binding 解决了 Android UI 编程中的一个痛点,官方原生支持 MVVM 模型可以让我们在不改变既有代码框架的前提下,非常容易地使用这些新特性。其实在此之前,已经有些第三方的框架(RoboAndroid) 可以支持 MVVM 模型,无耐由于框架的侵入性太强,导致一直没有流行起来。说到这里,其实网上也有很多快速的注解框架,但是注解框架与DataBinding想比还是不好用,而且官网文档说DataBinding还能提高解析XML的速度,其实DataBinding的好用,不仅仅体现在可以省去使用很多啰嗦findViewById,还有很多。
二、数据绑定框架DataBinding的用法
(1)环境搭建:
    使用 DataBinding之前,首先要先学会搭建使用它的环境。鉴于是去年发布的,现在大家AS的版本估计都在1.5以上了,就在1.5的版本上搭建和介绍吧,1.5之前的大家可以在网上搜索,因为我看网上大多数是介绍的1.3的使用方法,还没有很多对于1.5之后的环境搭建方法。
Android 的 Gradle 插件版本不低于 1.5.0-alpha1:
classpath 'com.android.tools.build:gradle:1.5.0'
然后在对应模块(Module)的 build.grade中添加:
[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. android {  
  2.     ....  
  3.     dataBinding {  
  4.         enabled = true  
  5.     }  
  6. }  

(2)例子展示
    例子的源代码【下载】←点击下载
    我们先用一个简单的例子来学习一下 DataBinding的 基础:
     1)首先先建立一个java bean,就是一个非常简单的Person 类。
[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. package com.example.administrator.myapplication;  
  2.   
  3. /** 
  4.  * Created by Administrator on 2016/7/19. 
  5.  */  
  6. public class Person {  
  7.     private String name;  
  8.     private String age;  
  9.   
  10.     public Person(String name, String age) {  
  11.         this.age = age;  
  12.         this.name = name;  
  13.     }  
  14.   
  15.     public void setName(String name) {  
  16.         this.name = name;  
  17.     }  
  18.   
  19.     public void setAge(String age) {  
  20.         this.age = age;  
  21.     }  
  22.   
  23.     public String getName() {  
  24.         return name;  
  25.     }  
  26.   
  27.     public String getAge() {  
  28.         return age;  
  29.     }  
  30. }  
      2)再来看看使用了DataBinding之后的布局文件,其主要的变化是在layout布局文件之中。
[html]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <layout xmlns:android="http://schemas.android.com/apk/res/android">  
  3.   
  4.     <data>  
  5.         <variable  
  6.             name="per1"  
  7.             type="com.example.administrator.myapplication.Person" />  
  8.         <variable  
  9.             name="work"  
  10.             type="String" />  
  11.     </data>  
  12.     <LinearLayout  
  13.         android:layout_width="match_parent"  
  14.         android:layout_height="match_parent"  
  15.         android:orientation="vertical">  
  16.         <LinearLayout  
  17.             android:layout_width="match_parent"  
  18.             android:layout_height="wrap_content"  
  19.             android:orientation="vertical">  
  20.             <TextView  
  21.                 android:layout_width="wrap_content"  
  22.                 android:layout_height="wrap_content"  
  23.                 android:text="@{per1.name}" />  
  24.             <TextView  
  25.                 android:layout_width="wrap_content"  
  26.                 android:layout_height="wrap_content"  
  27.                 android:text="@{String.valueOf(per1.age)}" />  
  28.             <TextView  
  29.                 android:layout_width="wrap_content"  
  30.                 android:layout_height="wrap_content"  
  31.                 android:text="@{work}" />  
  32.         </LinearLayout>  
  33.     </LinearLayout>  
  34. </layout>  
布局文件中并没有给控件定义id,而是用了@{ }的方法。Android studio是如何把值传进去的呢?在Activity中是又是如何使用的
     3)MainActivity .java文件
[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. package com.example.administrator.myapplication;  
  2. import android.app.Activity;  
  3. import android.databinding.DataBindingUtil;  
  4. import android.os.Bundle;  
  5. import com.example.administrator.myapplication.databinding.ActivityMainBinding;  
  6.   
  7. public class MainActivity extends Activity {  
  8.     @Override  
  9.     protected void onCreate(Bundle savedInstanceState) {  
  10.         super.onCreate(savedInstanceState);  
  11.         // setContentView(R.layout.activity_main);  
  12.         ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main);  
  13.   
  14.         Person per = new Person("zhang san"40);  
  15.         binding.setPer1(per);//给布局文件name="per1"传入数据,类型为Person对象  
  16.         binding.setWork("Teacher");//给布局文件name="work"传入数据,类型为String字符串  
  17.     }  
  18.   
  19. }  
     MainActivity 中没有使用findViewById去指定需要初始化的控件,也没有使用setText()指定显示的内容。下面详细说明一下:
     1)使用DataBinding 新框架必须导入包: import android.databinding.DataBindingUtil;
     2)以前在onCreate方法中通过setContentView设置布局;现在使用DataBindingUtil类的一个静态方法setContentView设置布局文件,但该方法会返回一个ActivityMainBinding对象。注意ActivityMainBinding对象会根据你的XML布局文件自动生成,其命名规则是这样的 先将XML布局文件的首字母大写;然后去掉下划线,将下划线后面的第一字母大写;再加Binding组合而成 。如布局文件是activity_main,则对应的类名为:ActivityMainBinding
     3)ActivityMainBinding由编译器根据布局文件的名字自动生成,因此在使用ActivityMainBinding时需要导入该包,一般形式是:当前包名+databinding+ActivityMainBinding
[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. import com.example.administrator.myapplication.databinding.ActivityMainBinding;  
      运行结果效果图如下:

(3)DataBinding使用说明
     1)XML布局文件
      相比以前使用的xml,根节点由具体的某个layout(比如LinearLayout )变成了layout,里面包括了data节点和传统的视图。先分析data节点,实质上这里的data节点就是连接 View 和 Modle 的桥梁。在这个data节点中声明一个variable变量,该变量需要指定name属性和type属性值。
[html]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <layout xmlns:android="http://schemas.android.com/apk/res/android">  
  3.     <data>  
  4.         <variable  
  5.             name="per1"  
  6.             type="com.example.administrator.myapplication.Person" />  
  7.         <variable  
  8.             name="work"  
  9.             type="String" />  
  10.     </data>  
  11.     <LinearLayout  
  12.         <LinearLayout  
  13.             ……………………  
  14.         </LinearLayout>  
  15.     </LinearLayout>  
  16. </layout>  
   变量名: name="per1"
    变量类型:type="com.example.administrator.myapplication.Person"
    type中声明的就是我们的用户实体类Person,等于全限定名(包+类名),我们给这个实体类命名为per1,per1可以看作是一个Person的对象。TextView中的@{per1.name}就是把这个per1中的名字展示出来,age同样如此。
     变量名:name="work"
     变量类型: type="String"
     那么控件是如何获得显示内容的呢?
[html]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. <TextView  
  2.           android:layout_width="wrap_content"  
  3.           android:layout_height="wrap_content"  
  4.           android:text="@{per1.name}" />  
  5.  <TextView  
  6.           android:layout_width="wrap_content"  
  7.           android:layout_height="wrap_content"  
  8.           android:text="@{String.valueOf(per1.age)}" />  
  9.  <TextView  
  10.           android:layout_width="wrap_content"  
  11.           android:layout_height="wrap_content"  
  12.           android:text="@{work}" />  
      注意到TextView的android:text,它的值是一个以@开始,以{}包裹的形式出现,而其内容由per1 .name指定。per1就是我们上面定义的variable变量; 而name是我们Person类中的一个变量。但name是Person的私有变量啊!!!!其实这里per1.name实质上调用的是Person类的getName()方法,因此per1.name等价于per1.getName()。 因此android:text="@{per1.name}"也可改为android:text="@{per1.getName()}";对于其他控件的分析也如此。
     PS:android:text指定的内容为String类型,因此,per1.age是int类型需要转换为String类型。
    2)绑定Variable
     虽然在布局文件中对应上了,但是值是怎么传进去的呢?这就是我们要将的Activity中的那两行代码了,它把实体类和布局文件进行了绑定。修改MainActivity中的onCreate,用 DatabindingUtil.setContentView() 来替换掉 setContentView(),然后创建一个Person对象 per   ,通过 binding.setPer1(per)与 variable 进行绑定。
      由于在XML文件中,指定 name="per1"的类型为Person,因此setPer1(Person per),即传入的类型必须是Person对象;同理在name="work"的类型为String,setWork("Teacher")必须传入字符串类型。
[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. protected void onCreate(Bundle savedInstanceState) {  
  2.        super.onCreate(savedInstanceState);  
  3.        ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main);  
  4.        Person per = new Person("zhang san"40);  
  5.        binding.setPer1(per);//给布局文件name="per1"传入数据,类型为Person对象  
  6.        binding.setWork("Teacher");//给布局文件name="work"传入数据,类型为String字符串  
  7.    }  
 【注意事项】
      【1】 这里需要注意的是使用binding调用setXxx方法,其中Xxx对应XML布局文件 name="Xxx"或者name="xxx";注意XML文件中name属性值的首字母可大写,也可小写。若 name="Xxx",则 binding.setXxx(),若 name="xxx",也是 binding.setXxx(),但不能写为 binding.setxxx()。
     【2】注意TextView控件设置显示文字 ,若写为: android:text="@{per1.age}",则会出现 错误
String resource ID #0x28
at android.content.res.Resources.getText(Resources.java:244)
at android.widget.TextView.setText(TextView.java:3888)
at com.example.administrator.myapplication.databinding.ActivityMa……

      这是由于android:text只能接受字符串的属性值,因此需要转换一下类型:android:text="@{String.valueOf(per1.age)}"
     【3】如果出现以下错误,(1)可能是因为你没有指定资源类型,(2)更大的可能是因为你没有搭配dataBinding环境!
Error:(27, 31) No resource type specified (at 'text' with value '@{per1.name.toString()}').
Error:(32, 31) No resource type specified (at 'text' with value '@{String.valueOf(per1.age)}').
Error:(36, 31) No resource type specified (at 'text' with value '@{work}').
 
 【参考资料】
 关于DataBinding的高级应用,可以参考这些文章:
【1】《Android数据绑定框架DataBinding,堪称解决界面逻辑的黑科技》 http://www.jianshu.com/p/2d3227d9707d
【2】《 Android官方数据绑定框架DataBinding(一) 》http://blog.csdn.net/qibin0506/article/details/47393725
【3】《Android官方数据绑定框架DataBinding(二)》http://blog.csdn.net/qibin0506/article/details/47720125
【4】英文好的,推荐官网教程:https://developer.android.com/topic/libraries/data-binding/index.html
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值