解决databinding与包名大写的冲突

真是一个世纪性的难题。
谁说Android包名使用databinding就不能大写?

0x00、我的问题背景(可不看)

公司有两个项目,公司主业务项目a,2年前封笔的项目b,b又名a的经典版。

现在有一个需求,将a项目最新的代码,整合到b项目中。

a项目应用了mvvm,自然有databinding。然后。。。
b项目的包名有大写的,呵呵呵,听到包名大写,是不是某处一凉?

刚改完bug的我,才下眉头,却上菊头。

0x01、问题

使用databinding,包名大写了怎么办?

b项目的包名是大写的。

databinding在项目包名大写时,会出问题。

比如找不到binding类,

java包名为什么要小写 java包名大写_移动开发


java包名为什么要小写 java包名大写_databinding包名大写_02


或者:

Cause: couldn’t make a guess for xxx

java包名为什么要小写 java包名大写_java包名为什么要小写_03


现在已经用到了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。

java包名为什么要小写 java包名大写_移动开发_04


java包名为什么要小写 java包名大写_移动开发_05


新建包也是为了下一步拷贝一些bean类和自定义view。

(布局中配置了data的class之后,电脑卡的话,需要等几秒钟,才会生成对应的binding类,例子中是:ActivityChatRecommendBinding。电脑不卡的话,配置完马上就有了。)

二 拷贝布局文件中引用到的bean类自定义view,到新建的小写包中

1 比如:

variable标签都检查一遍,里面引用的类大多都是拷贝的。

如图,之前的类名都是

java.util.List<com.大写.大写.mvvm.chatRec.viewModels.ItemsBean>

com.大写.大写.entity.LiveListEntity

不能泄密,我用com.大写.大写代表我之前有大写的包名。现在改为小写包名:

java包名为什么要小写 java包名大写_java包名为什么要小写_06


如上图所示,我已经把ItemBean和LiveListEntity拷贝到小写包名里了。

还有自定义view:

java包名为什么要小写 java包名大写_java包名为什么要小写_07


如上图所示,我已经把自定义view LinkTextView拷贝到小写包名里了。

另外

拷贝的时候,利用Androidstudio自带的工具,代码中的包名会自动给我们更新的。

将要拷贝的类或者一整个包都可以,右键——Refactor——Move…

java包名为什么要小写 java包名大写_databinding包名大写_08


填写要拷贝到哪里:

java包名为什么要小写 java包名大写_databinding_09


点击右下角的,Refactor就可以了。

另外的另外

我这个项目都是bean类放在一起的。所以图方便也可以将整个bean类所在的包,Refactor move到新建的小写的包中。用此方法,旧代码中涉及包名的地方自动更新,不影响其他逻辑。

最后,运行完毕,安装成功,满心欢喜。

java包名为什么要小写 java包名大写_移动开发_10

java包名为什么要小写 java包名大写_移动开发_11

0x03 最后的最后扯扯淡

转载需要经过我同意。然后挂上我的链接才可以哦。

我们每次遇到棘手的问题,上网查,简单的能查到,却有时什么都查不到。

千篇一律的复制粘贴复制粘贴的帖子。

这时候我就在想,那些自以为自己很牛的“大牛”们哪去了?你们嘲笑我所处的平台不够高,就说我垃圾。觉得你们自己在阿里,在联想,平台很大,所以自己很厉害,哪都比我好,我哪里都不好。

(最近被2位阿里和联想的朋友鄙视了,贬低我所处平台的所有东西,觉得我们什么都不好,当然了,阿里和联想的其他人还是很好的)

你们就真的以为平台代表了你的能力吗?

别骗自己了,当自己的斤两,只有自己清楚的时候,就不会去贬低别人了

其实你们有很多地方,都不如捡破烂的老头,爱打羽毛球,穿个白看裤衩,露个小白头。