butterknife 是一款能够提高android代码效率的一个编译插件,只需要按照文档教程在规定的地方写好注解,然后在代码规定的地方启动,就能够自定帮你初始化View控件,避免在代码中出现n多的findViewById方法。配合Android ButterKnife Injections这款Android Studio插件将xml和代码关联起来,效率又提高一个层级。
按照https://github.com/JakeWharton/butterknife文档显示,要使用butterknife必须在Gradle添加以下依赖。
添加butterknife10.1.0的步骤
第一步:在每一个Module中添加依赖(这个很重要)
android {
...
// Butterknife requires Java 8.
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
dependencies {
implementation 'com.jakewharton:butterknife:10.1.0'
annotationProcessor 'com.jakewharton:butterknife-compiler:10.1.0'
}
第二步:在build.gradle中添加编译插件依赖
buildscript {
repositories {
mavenCentral()
google()
}
dependencies {
classpath 'com.jakewharton:butterknife-gradle-plugin:10.1.0'
}
}
第三步:还要将每个module变成(很重要):
apply plugin: 'com.android.library'
apply plugin: 'com.jakewharton.butterknife'
一般按照以上步骤以后,都不会出现问题。
配合工具插件
这里推荐两款工具插件:
- 一款是很传统的 Android ButterKnife Zelezny ,需要删除升级到最新版本,会默认提供R转为R2的功能。因为在xx版本后,R已经是常量值,所以不支持R作为注解存在。
- 一款是网友推荐的Android ButterKnife Injections,这款插件是集成Android ButterKnife Zelezny基础上进行二次开发的,继承了原来所有的优点,再此基础上添加了一些使用的功能。插件说明如下:
中文说明:
适用于父类为kt文件,子类为java文件的情况。 原插件不能正常使用,我也没有找到能满足需求的插件。我克隆了“android-butterknife-zelezny”的源码,在其基础上修改调整后,发布了这个插件。 功能:
包含Android ButterKnife Zelezny v1.6.0的所有功能。
可选是否初始化ButterKnife(避免原版本使用插件即自动在onCreate中添加ButterKnife.bind(this),适用于在基类中初始化)。
可选是否在Lib中使用(使用R2替换R,onClick中使用if-else)。
2、3可在Android Studio设置页配置默认值
Android ButterKnife Injections 更面向未来,因为提供了对kotlin语言的支持。
注意事项
- 如果缺少第一步,将会在没有放置依赖的module里面出现一个运行时问题,即空指针的问题。这个错误很隐蔽,因为ButterKnife的编译依赖不会传递,需要在每一个module中设置。
- 如果少了第二步,那就直接无法编译。
- 将R变成R2,不然编译不通过(这个交由插件完成即可)。
- 如果少了第三步,直接编译报错。
- 在Activity 类中绑定 :ButterKnife.bind(this);必须在setContentView();之后绑定;且父类bind绑定后,子类不需要再bind
- 在非Activity 类(eg:Fragment、ViewHold)中绑定: ButterKnife.bind(this,view);这里的this不能替换成getActivity()。
- 在Activity中不需要做解绑操作,在Fragment 中必须在onDestroyView()中做解绑操作。
- 使用ButterKnife修饰的方法和控件,不能用private or static 修饰,否则会报错。(一般生成是默认形式)
总结很到位,3Q