Hi!请登陆

如何升级使用butterknife10.1.0及使用注意事项

2020-10-17 72 10/17

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 修饰,否则会报错。(一般生成是默认形式)

相关推荐