DataBinding生成文件的时机
2018-03-31 11:03
148 查看
前言
上上周进行了DataBinding原理分析,但是并没有对DataBinding如何生成文件进行研究。如何生成文件,当然也利用了apt(annotation-processing-tool),apt在很多三方框架中都有使用,例如:ButterKnife,Arouter,EventBus等等。这里就不介绍了,推荐一个github上的demo–DemoAbstractProcessor。
正文
本文主要想讨论的是DataBinding生成文件的时机。在印象里,我只要做如下操作,以下都称为操作A:
给一个Activity的xml设置了DataBinding的layout标签,然后用Activity去绑定这个xml。
就可以引用到了对应的DataBinding类,这里创建的Activity是TestActivity,对应地可以引用到ActivityTestBinding。
在这里我是存疑的,因为如果是通过apt技术的话,意味着我在做完操作A的时候,AS自动去捕捉了操作A,然后进行了编译,之后我才能引用到对应的DataBinding类。
那什么时候AS自动进行了编译,去生成文件呢?我测试了很久,发现,如果我只是进行操作A,gradle并没有执行编译操作,当然没有生成任何新的文件。
然后我
Make project之后,发现生成了各种DataBinding相关文件,当然包括ActivityTestBinding。
然后我突然想到有时候我完成操作A的时候,并不能成功去引用DataBinding类。
这里我就有了一个猜想:AS在我做完操作A时,在它的缓存里存储了一个标志符名字就叫ActivityTestBinding,并且在我点击
import com.example.tsnt.databinding.ActivityTestBinding;中的ActivityTestBinding时就自动跳转到了对应的xml文件–activity_test。大多数情况是这样的,但有时候并没有成功添加缓存,所以我们引用不到ActivityTestBinding。
然而即使在编译之后,真正生成了ActivityTestBinding类,我们点击
import com.example.tsnt.databinding.ActivityTestBinding;中的ActivityTestBinding时还是自动跳转到了对应的xml文件–activity_test,并没有跳转到ActivityTestBinding类。这样做的原因我觉得可能是,隐藏了DataBinding的实现细节更加便于我们的开发,因为大多数情况下我们不用去关心生成的DataBinding类,我们只要知道Activity通过DataBinding成功绑定了xml就可以了。
其实有时候是可以点击
import com.example.tsnt.databinding.ActivityTestBinding;中的ActivityTestBinding跳转到ActivityTestBinding类的,这是什么时候呢?就是AS的缓存没生成成功,ActivityTestBinding类又真实存在的时候。
总结
我又进行了一些测试,最后做出如下总结:生成的DataBinding类名字是和xml相关的,和Activity无关,xml叫activity_test,DataBinding类就叫TestActivityBinding。具体生成名字的规则请自行查看ProcessDataBinding的源码。
正常情况下,我们给一个xml正确设置layout标签,并且写一个根布局或者有id的View或者绑定ViewModel属性的View时,AS自动创建一个对应DataBinding类的标志符。
在编译之后,通过apt,真正的DataBinding类和其他相关文件才会生成。
正常情况下,我们点击
import com.example.tsnt.databinding.ActivityTestBinding;中的ActivityTestBinding跳转到的都是对应的xml文件activity_test,是DataBinding 对使用者隐藏了实现细节,便于使用者进行开发。
在缓存没有成功生成的时候,如果ActivityTestBinding类又真实存在的时候,我们点击
import com.example.tsnt.databinding.ActivityTestBinding;中的ActivityTestBinding跳转到的才是真正的ActivityTestBinding类。
相关文章推荐
- Android 工程中的 R.java 文件丢失后如何重新生成
- delphi 生成xml 方法 与 delphi txt文件操作
- 在项目中引用Service References,自动生成的.cs文件
- MFC使用Haru free pdf lib生成pdf文件
- win10系统 安装modelsim64位的无法生成license文件的解决办法
- sx:tree 标签生成树状的文件列表
- 不使用Cygwin,在eclipse中快速开发JNI,一键生成C头文件.h,以及一键使用NDK交叉编译
- 通过微软的HTML Help Workshop 利用.html文件 生成简单的chm帮助类的文件
- Nconf生成Nagios配置文件出错及解决办法
- 随机生成文件名字或随机生成一个数
- 闲话VS家族中工程文件之组织生成篇
- python处理文本文件,生成指定格式的文件
- DOS总生成目录文件的tree命令--tree /f e:/book >e:/list.txt
- corba出体验,通过idltojava(idlj)生成java文件
- 一个简单的 C 程序文件,经过 0、编写,1、预处理,2、编译,3、链接,终于生成了一个可执行文件
- 用shell脚本生成日志文件
- JDK1.7.0_51使用javah工具生成.h声明文件的环境配置
- Log4Net 生成多个文件、文件名累加解决方法
- Latex生成PDF文件中字体无法嵌入
- 关于客户端下载文件而不是在服务器生成文件