databinding包名不能大写?——不改包名解决databinding与包名大写的冲突Android
Posted 太书红叶
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了databinding包名不能大写?——不改包名解决databinding与包名大写的冲突Android相关的知识,希望对你有一定的参考价值。
解决databinding与包名大写的冲突
真是一个世纪性的难题。
谁说android包名使用databinding就不能大写?
0x00、我的问题背景(可不看)
公司有两个项目,公司主业务项目a,2年前封笔的项目b,b又名a的经典版。
现在有一个需求,将a项目最新的代码,整合到b项目中。
a项目应用了mvvm,自然有databinding。然后。。。
b项目的包名有大写的,呵呵呵,听到包名大写,是不是某处一凉?
刚改完bug的我,才下眉头,却上菊头。
0x01、问题
使用databinding,包名大写了怎么办?
b项目的包名是大写的。
databinding在项目包名大写时,会出问题。
比如找不到binding类,
或者:
Cause: couldn’t make a guess for xxx
现在已经用到了databinding,而且有好多页面都是这样,不能把这些页面一个一个再重新写一遍吧?
那不开玩呢吗?那就赶紧刷题吧。
这里说一下:(可不看)
当布局文件的根元素使用元素后,Android Studio就会根据布局文件名自动生成一个Binding类,否则不会作处理。默认情况下生成的Binding类名是根据布局文件名称生成的,大写字母开头,移除下划线并大写后面的字母最后加上“Binding”后缀。这个类会放在module包下的databinding包下。例如,布局文件contact_item.xml会生成ContactItemBinding。如果module包名为 com.example.my.app那它会放在com.example.my.app.databinding包下。这个类控制着布局文件中的所有binding,从布局属性(如:variable变量)到布局View及设置绑定表达式的值。
对于布局中每个设置ID的View会在Binding类中生成对应的public final域,生成规则为View的ID名首字母小写,移除下划线并大写后面的字母。例如,View ID tv_hello会生成tvHello。
对于每个被描述的变量生成的binding类会对应有setter和getter。变量会使用Java默认值直到setter被调用——引用类型为null,int为0,boolean为false,等等。当为了不同的配置(例:横屏或竖屏)有不同的布局文件,这些变量会被合并。这些布局文件中定义的变量不能有冲突。
谷歌内部代码写的肯定规范,但是不规范的代码,他们就不兼容了吗?
不见得,一定有配置可以解决的。
0x02、解决
解决问题最核心的知识点:配置databinding生成的binding类的路径。
一 配置data标签的属性
通过 < layout >标签下的< data >标签的class属性修改Binding放在不同包下,同时也能自己指定一个类名。
比如:
如图,我新建了一个小写的包名,为com.octinnlite.birthdaylite,同时规定我这个布局生成的binding类名为:ActivityChatRecommendBinding。
新建包也是为了下一步拷贝一些bean类和自定义view。
(布局中配置了data的class之后,电脑卡的话,需要等几秒钟,才会生成对应的binding类,例子中是:ActivityChatRecommendBinding。电脑不卡的话,配置完马上就有了。)
二 拷贝布局文件中引用到的bean类自定义view,到新建的小写包中
1 比如:
variable标签都检查一遍,里面引用的类大多都是拷贝的。
如图,之前的类名都是
java.util.List<com.大写.大写.mvvm.chatRec.viewModels.ItemsBean>
com.大写.大写.entity.LiveListEntity
不能泄密,我用com.大写.大写代表我之前有大写的包名。现在改为小写包名:
如上图所示,我已经把ItemBean和LiveListEntity拷贝到小写包名里了。
还有自定义view:
如上图所示,我已经把自定义view LinkTextView拷贝到小写包名里了。
另外
拷贝的时候,利用Androidstudio自带的工具,代码中的包名会自动给我们更新的。
将要拷贝的类或者一整个包都可以,右键——Refactor——Move…
填写要拷贝到哪里:
点击右下角的,Refactor就可以了。
另外的另外
我这个项目都是bean类放在一起的。所以图方便也可以将整个bean类所在的包,Refactor move到新建的小写的包中。用此方法,旧代码中涉及包名的地方自动更新,不影响其他逻辑。
最后,运行完毕,安装成功,满心欢喜。
0x03 最后的最后扯扯淡
转载需要经过我同意。然后挂上我的链接才可以哦。
我们每次遇到棘手的问题,上网查,简单的能查到,却有时什么都查不到。
千篇一律的复制粘贴复制粘贴的帖子。
这时候我就在想,那些自以为自己很牛的“大牛”们哪去了?你们嘲笑我所处的平台不够高,就说我垃圾。觉得你们自己在阿里,在联想,平台很大,所以自己很厉害,哪都比我好,我哪里都不好。
(最近被2位阿里和联想的朋友鄙视了,贬低我所处平台的所有东西,觉得我们什么都不好,当然了,阿里和联想的其他人还是很好的)
你们就真的以为平台代表了你的能力吗?
别骗自己了,当自己的斤两,只有自己清楚的时候,就不会去贬低别人了
其实你们有很多地方,都不如捡破烂的老头,爱打羽毛球,穿个白看裤衩,露个小白头。
😬😬😬
CSDN免费下载、课程+书免费学,快来看看!
https://marketing.csdn.net/poster/112?utm_source=1538247462&spm=1000.2116.3001.4180
以上是关于databinding包名不能大写?——不改包名解决databinding与包名大写的冲突Android的主要内容,如果未能解决你的问题,请参考以下文章