如果一直用着ButterKnife,但是用的低版本(比如用得很多的8.4.0),然后在多module项目中一定知道要把R改成R2。
然后最近如果升级AndroidStudio了,升到3.3以上(2019.1发布的3.3.0),你可能忽然发现module中的R2是一直报红的,无论怎么 build 怎么 invalidate caches 都没用,R2文件无法生成。
然后在issue找答案,最后发现说在9.0.0中已经解决了。
下面贴下正确操作姿势
1.project的build.gradle 配置
buildscript {
repositories {
google()
jcenter()
mavenCentral()
maven { url 'https://maven.fabric.io/public' }
maven { url "https://oss.sonatype.org/content/repositories/snapshots" }
}
dependencies {
classpath 'com.android.tools.build:gradle:3.1.2'
classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
classpath 'com.jakewharton:butterknife-gradle-plugin:9.0.0-SNAPSHOT'
}
}
allprojects {
repositories {
google()
jcenter()
maven { url "https://oss.sonatype.org/content/repositories/snapshots" }
}
}
2、module中的build.gradle配置
apply plugin: 'com.jakewharton.butterknife'
implementation 'com.jakewharton:butterknife:9.0.0-SNAPSHOT'
annotationProcessor 'com.jakewharton:butterknife-compiler:9.0.0-SNAPSHOT'
3、注意
3.1 如果其他module也需要使用butterknife,也需要导入步骤2的三行代码,不然会报错找不到注解,即使你引用了其他已经使用了butterknife的module。
3.2 使用
@BindView(R2.id.action_bar)
Button button1;
@BindView(R2.id.tab_layout)
Button tabLayout;
将R改成了R2,不然一直报错说id必须是常量。
OnClick事件之前可能是这么写的:
@OnClick({R2.id.action_bar, R2.id.tab_layout})
public void onActionBarClicked(View view) {
switch (view.getId()) {
case R2.id.action_bar:
startActivity(CoordinatorActionBarActivity.class);
break;
case R2.id.tab_layout:
startActivity(CoordinatorTabActivity.class);
break;
}
}
现在必须改成这样,分开来写,或者使用if语句也可以的:
@OnClick(R2.id.action_bar)
public void onActionBarClicked(View view) {
startActivity(CoordinatorActionBarActivity.class);
}
@OnClick(R2.id.tab_layout)
public void onTabClicked(View view) {
startActivity(CoordinatorTabActivity.class);
}
===================================================
鬼知道搞这个问题搞了多久 (。 ́︿ ̀。) 心疼自己一秒钟