前段时间升级了 Android Studio 目前版本是 4.1.3
然后组里有一个人问我,R.java 文件在哪啊?一般来说,你可以直接点进去啊,或者在 build 文件夹底下都可以找到,然后他说找不到,于是我亲自给找:
还真的是啥都没有!!!!😲
于是我开始全局搜索查找,最终还是被我找到了,不过我没发现 R.java 文件,但是我看到了 R.class 文件,也差不多是想要的,在如下目录:
里面就是我们的资源 id 了:
同时,因为我们现在都是组件化开发项目,我们在使用 ButterKnife 的时候,也发现使用的是 R2 而不是 R 了,这个 R2 文件很好找:
那为什么用 R2 不用 R 了呢?
一般来说我们在 app 壳里的类经过编译之后,是这样的:
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.setContentView(2131296285);
LinearLayout ll_container = (LinearLayout)this.findViewById(2131165316);
View child = View.inflate(this, 2131296292, (ViewGroup)null);
ll_container.addView(child);
}
而如果是我们在 library 中编写的类经过编译之后,却略有不同:
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.setContentView(layout.activity_me);
TextView tv = (TextView)this.findViewById(id.tv);
}
它不是一个唯一确定的值了,而是 id.xx 这种形式,需要在运行时才能拿到。在这个 library 的 R.class 中也可以看到不再是 final 类型:
public static int tv = 2131492967;
所以我们在 library 中使用 R.id.tv 利用 ButterKnife 是报错的,因为生成的不是 final 类型了。
ButterKnife 使用一个插件,拷贝 R 中所有的值到 R2中,并且把 R2 中的值都设置为 final 类型,这样就可以编译通过啦。
今日小分享到此结束,有问题评论区见哦~