解決插件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 代替
TAG:程序員小新人學習 |