解决插件ButterKnife在Library中使用的问题
前言
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 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
- 在 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 中使用时,和单组件开发形式一样使用
2、在library 中使用
- 要用 R2 代替 R findviewid
- 在 click方法 中同样使用 R2,但是找 id 的时候使用 R。
- 不能使用 switch- case 找 id 的,用 if-else 代替