前段时间升级了 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
类型,这样就可以编译通过啦。
今日小分享到此结束,有问题评论区见哦~