解决插件ButterKnife在Library中使用的问题

sheikhdz 2018-06-06

前言

ButterKnife是控件注入框架,可以帮助安卓开发者省去初始化控件的重复性工作,简单快捷地初始化布局文件中的控件,极大地提升开发效率。

1. 背景

在一般app中我们都是单组件开发,即只有一个主moduel,所有代码不管是java,xml,资源,依赖库都在app中,此时使用 ButterKnife 是非常简单的,参考 GitHub 官方文档 就可完成。

2. 问题

但是,当你想对项目进行组件化开发,需要在 Library 中使用 ButterKnife 时,如果还是参照 GitHub 官方文档 上的方法,你会发现不管你怎么调整代码,编译永远不通过,最终无法使用,这是一个巨大的坑啊!!!

这是 Android studio 3.0 与 ButterKnife 8.5.1 (含 8.5.1)的冲突所致,官方论坛 上给予了一些解释。

3. 解决方案

1、在 Project 的 build.gradle 中引入 ButterKnife,特别注意 引入 ButterKnife 的版本,不要使用8.5.1及以上版本,使用 8.4.0版本。

buildscript {
 repositories {
 jcenter()
 mavenCentral()
 }
 dependencies {
 classpath 'com.android.tools.build:gradle:3.1.2'
 classpath 'com.jakewharton:butterknife-gradle-plugin:8.4.0'
 }
}
1
2
3
4
5
6
7
8
9
10

解决插件ButterKnife在Library中使用的问题

注:

如果这里引入 ButterKnife 8.5.1 以上的版本,如:

classpath 'com.jakewharton:butterknife-gradle-plugin:8.8.1'
1

会出现编译异常:

Unable to find method 'com.android.build.gradle.api.BaseVariant.getOutputs()Ljava/util/List;'.
Possible causes for this unexpected error include:<ul><li>Gradle's dependency cache may be corrupt (this sometimes occurs after a network connection timeout.)
Re-download dependencies and sync project (requires network)</li><li>The state of a Gradle build process (daemon) may be corrupt. Stopping all Gradle daemons may solve this problem.
Stop Gradle build processes (requires restart)</li><li>Your project may be using a third-party plugin which is not compatible with the other plugins in the project or the version of Gradle requested by the project.</li></ul>In the case of corrupt Gradle processes, you can also try closing the IDE and then killing all Java processes.
1
2
3
4

2、在 Library 的 build.gradle 中 引入 butterknife

  • 在library的build.gradle中引入插件
apply plugin: 'com.jakewharton.butterknife'
1

解决插件ButterKnife在Library中使用的问题

  • 在 dependencies 中添加依赖,此处可以使用最新版 butterknife
implementation 'com.jakewharton:butterknife:8.8.1'
annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1'
1
2

若想 library 中的 butterknife 被主 module 使用,可将 implementation 改为 api:

api 'com.jakewharton:butterknife:8.8.1'
annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1'
1
2

到此,接入工作完毕。

4. 使用和注意事项

1、在 主module 中使用时,和单组件开发形式一样使用

解决插件ButterKnife在Library中使用的问题

2、在library 中使用

  • 要用 R2 代替 R findviewid

解决插件ButterKnife在Library中使用的问题


  • 在 click方法 中同样使用 R2,但是找 id 的时候使用 R。

解决插件ButterKnife在Library中使用的问题


  • 不能使用 switch- case 找 id 的,用 if-else 代替

解决插件ButterKnife在Library中使用的问题


相关推荐