#前言#

上一篇简单的介绍了DataBinding的用法,这几篇来仔细的介绍一下的功能。

#data 标签 的功能#

<data class="test"></data>
复制代码

class 属性

生成指定的名称的Binding对象。

什么是Bind对象呢?来回顾之前的一句代码

ViewDataBinding mBinder = DataBindingUtil.setContentView(this, R.layout.activity_main);
复制代码

通过这一句,系统会自动帮助我们生成一个ViewDataBinding的子类,帮助我们操作xml中绑定的数据,所以就需要给这个类起一个响亮的名字,根据Java的命名规则,R.layout.activity_main 就会默认生成 ActivityMainBinding,这个规则一看就明白。

class属性就是帮助我们改变生成的类名和位置,有以下三种用法:

1、在模块封装包的databinding包中会生成名为TestBinding的Binding类。

<data class="TestBinding"></data>
复制代码

2、在这个情况下,TestBinding类直接在模块包种生成

<data class="TestBinding"></data>
复制代码

3、在指定的包下生成Binding类。

<data class="com.example.TestBinding"></data>
复制代码

如果没有特殊需求,使用系统默认的命名就可以了。

那生成的ActivityMainBinding 与 ViewDataBinding 之间有什么区别呢?? 最大的区别的就在于ActivityMainBinding中为设置的variable生成了setter 和 getter方法,设置绑定数据更加简便。

public class MainActivity extends AppCompatActivity {private ActivityMainBinding mBinder;private User user;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);mBinder = DataBindingUtil.setContentView(this, R.layout.activity_main);// 设置绑定的user对象user = new User();user.setName("屌爆了");mBinder.setUser(user);// 绑定listener对象TestClickListener testClickListener = new TestClickListener();mBinder.setListener(testClickListener);}/*** 自定义的点击回调监听**/public class TestClickListener {public void onClickListenerBinding(View view) {Toast.makeText(MainActivity.this, "1111", Toast.LENGTH_SHORT).show();}}
复制代码

#data 的子标签#

variable

这个标签之前已经见过了,他用来绑定具体的对象的类。

<variablename="user"type="com.lzp.myapplication.bean.User"/>复制代码

import

<data><import type="java.util.List"/><variable name="users" type="List&lt;String&gt;" /><import type="com.example.util.StringUtil"/>
</data>
复制代码

请注意,在xml中对于尖括号(<>)的使用是很严格的,否则会影响xml的正常解析,所以在这里必须对尖括号进行转义,虽然会红字报错,但是是可以正常运行的。

import 表示引入引入某一个类,从上面看到引入了java.util.List,然后定了User的列表,还有引入了一个工具类 com.example.util.StringUtil。

name 是引用的名称, type是具体的包名+类名,指明具体的类的地址。

那么如果引入了两个相同类名的怎么办?

<data><importtype="com.lzp.myapplication.bean.User" /><importtype="com.lzp.myapplication.User"alias="User2" /></data>复制代码

import 还有一个alias属性,帮助我们来为引入的对象起别名,同样可以引用,这样就可以区别相同类名的不同类了。

#如何使用data中引入和定义的内容#

variable

使用variable中的bean对象,如果是属性,直接使用@{name.field}

<TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="@{user.name}" />
复制代码

如果使用的无参数方法,@{() -> name.function()}

<TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:onClick="@{() -> listener.onClickListenerBinding()}"android:text="@{Utility.autoAppend(v,user.name)}" />复制代码

点击事件需要把点击的view传入并操作,@{(v) -> name.function(v)}

括号中间的v就表示当前的这个view的参数名称(可以自定义),直接作为参数名使用就可以。

<TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:onClick="@{(v) -> listener.onClickListenerBinding(v)}"android:text="@{user.name}" />
复制代码

import

使用import引入的工具类,@{util.function()}

<TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="@{Utility.autoAppend(user.name)}" />复制代码

目前在静态方法不能通过使用bean的形式来传入view参数,具体解决办法之后在介绍。

#include#

Includes的使用<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:bind="http://schemas.android.com/apk/res-auto"><data><variable name="user" type="com.example.User"/></data><LinearLayoutandroid:orientation="vertical"android:layout_width="match_parent"android:layout_height="match_parent"><include layout="@layout/name"bind:user="@{user}"/><include layout="@layout/contact"bind:user="@{user}"/></LinearLayout>
</layout>
复制代码

系统会自动生成一个自定义属性bind,通过bind可以直接对include中的layout中绑定的数据直接进行赋值,这样就可以间接的控制include中的操作。

#ViewStub#

如果是ViewStub怎么绑定??

binding = DataBindingUtil.setContentView(this, R.layout.activity_view_stub);
binding.viewStub.setOnInflateListener(new ViewStub.OnInflateListener() {@Overridepublic void onInflate(ViewStub stub, View inflated) {ViewStubBinding binding = DataBindingUtil.bind(inflated);User user = new User("fee", "lang");binding.setUser(user);}
});
复制代码

分析上面的代码,首先ViewStub在尚未添加到xml中时,获取Bindgin对象肯定是无效的,所以需要在OnInflateListener中回调被添加的事件,然后再去获Bing对象。

#总结#

我们已经把DataBinding的大部分使用场景都已经讲过了,已经能够满足大部分场景的需求,从一个小白直接飙升到了中级水平,但是勤能补拙,熟能生巧,我们还需要通过不懈的练习来巩固所学的知识。有讲错的地方和不足请留言指出,大家一起学习进步。

下一篇我们来了解一下DataBinding 在 Java 代码为我们具体提供了哪些重大的功能。

DataBinding 学习系列(2)详解DataBinding在xml中的使用相关推荐

  1. 大型企业网络配置系列课程详解(五) --Frame-Relay配置与相关概念的理解

    大型企业网络配置系列课程详解(五)             --Frame-Relay配置与相关概念的理解   实验原理: Frame-Relay(帧中继)简称FR,是国际电信联盟通信标准化组(ITU ...

  2. 大型企业网络配置系列课程详解(三)--OSPF高级配置与相关概念的理解

    大型企业网络配置系列课程详解(三)<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office&qu ...

  3. 深度学习开发环境调查结果公布,你的配置是这样吗?(附新环境配置) By 李泽南2017年6月26日 15:57 本周一(6 月 19 日)机器之心发表文章《我的深度学习开发环境详解:Te

    深度学习开发环境调查结果公布,你的配置是这样吗?(附新环境配置) 机器之心 2017-06-25 12:27 阅读:108 摘要:参与:李泽南.李亚洲本周一(6月19日)机器之心发表文章<我的深 ...

  4. 大型企业网络配置系列课程详解(四) --HSRP和VRRP配置与相关概念的理解(一)...

    大型企业网络配置系列课程详解(四)<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office&qu ...

  5. Windows 网络服务架构系列课程详解(一) ----DHCP服务器的搭建与配置

    Windows 网络服务架构系列课程详解(一) ---------DHCP服务器的搭建与配置   实验背景: 企业网络环境中在没有配置DHCP服务器时,经常会遇到这样的情况,用户不懂怎么去配置IP地址 ...

  6. 大型企业网络配置系列课程详解(八) --VoIP的配置与相关概念的理解

    大型企业网络配置系列课程详解(八) --VoIP的配置与相关概念的理解   试验背景: 伴随着电路交换网络的发展,PSTN(公共交换电话网络)的普及已经给人类带来了前所未有的方便,在现实生活中只要有P ...

  7. java8编程开发入门 李兴华_李兴华系列--JAVA详解视频(jdk1.8)及项目实战教程

    李兴华系列--JAVA详解视频教程(jdk1.8)有源码+文档01_<Oracle从入门到精通> 02_<Java8编程入门> 03_<Java8面向对象编程> 0 ...

  8. 《网络架构系列2-Http详解》

    不诗意的女程序媛不是好厨师~ 转载请注明出处,From李诗雨-[https://blog.csdn.net/cjm2484836553/article/details/104136511] <网 ...

  9. 【论文精读3】MVSNet系列论文详解-P-MVSNet

    P-MVSNet全名为"P-MVSNet: Learning Patch-wise Matching Confidence Aggregation for Multi-View Stereo ...

  10. 图像分割UNet系列------UNet详解

    图像分割unet系列------UNet详解 1.UNet网络结构 2.UNet网络结构高性能的原因分析 3.医学图像使用UNet网络结构     UNet最早发表在2015的MICCAI上,到202 ...

最新文章

  1. 使用java9的uuid生成方式,让uuid生成速度提升一个档次...
  2. 别忘了,明天是BCH的压力测试日
  3. C++多小球非对心弹性碰撞(HGE引擎)
  4. BZOJ 1051 受欢迎的牛(Tarjan缩点)
  5. springmvc配置文件的主要内容
  6. CentOS6安裝Cacti
  7. python的应用论文_python 论文
  8. 非涉密计算机检查的通知,关于开展非涉密计算机及可移动存储介质专项清理活动的紧急通知...
  9. 1007. Maximum Subsequence Sum (25)
  10. git 创建新分支并关联远程分支_git常用操作命令归纳
  11. sublime Text 2使用小技巧
  12. C++ 访问成员 “->“还是“.“
  13. Mysql基础之 ALTER命令
  14. yolov3详细讲解
  15. 如何用计算机算rsd,rsd计算(rsd计算公式在线版)
  16. xui和嘟嘟桌面哪个好_最全的纸尿裤测评,新手妈妈必看,嘟嘟妈教你少踩雷
  17. 大学生计算机应用大赛广告设计,第11届全国大学生计算机应用能力与信息素养大赛 “平面视觉设计” 赛项圆满结束...
  18. python pyinstaller打包exe添加版本信息
  19. 有关“凸”方面的概念:凸(集/函数/优化/二次规划)
  20. 运行时错误91问题汇总

热门文章

  1. Android中的多种文件读写操作方法
  2. C与java通讯小结
  3. JFreeChart 1.0.6 用户开发指南(中文)
  4. jsonp跨域读取cookie
  5. css3蒙版运动,纯CSS3制作逼真的汽车运动动画
  6. 微信小程序php get_php处理微信小程序request请求
  7. 新疆计算机一级考试试题视作题,2014新疆计算机一级考试试题汇总
  8. android app.build文件_网易友品 Android 客户端组件化演进
  9. linux怎么切换为oracle用户权限,linux肿么给oracle中用户权限
  10. java打星星_java实现星星图形的输出