ButterKnife 无法找到id问题

时间:2024-03-13 09:07:09

忘记有多久没用ButterKnife ,最近又想起来使用Butterknife了,但是却遇到了很多错误,总结下。

官网:http://jakewharton.github.io/butterknife/,github: https://github.com/JakeWharton/butterknife

开始导入的是8.6.0和8.8.1,然后各种报错,说BindView是id不是常量,原谅我很久没用了。

然后呢,有开始说id找不到:

ButterKnife 无法找到id问题

然后就改呀改,找呀找,也有说是没有clean的原因,但是我试过很多次都没用。

接着就遇到报空指针的问题,然后在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);
}