在元件化開發中Butterknife的使用存在許多的問題,最開始的時候我以為直接引入Butterknife直接引入到專案中就可以了呢!但是後來發現不行,會有各種各樣的錯誤,所以用這篇文章記錄一下,防止其他人採坑!!!
在Butterknife的GitHub官網中是這麼描述關於在Library中整合的!
先來說一下專案,我們是在公共modules中引入了一些基礎元件的!所以我的主要的一些引用都放在那個基礎模組中去了!其實這個基礎元件也就相當於一個類庫而已了!
先說一下你可能遇到的問題:
- 編譯不通過報錯;
- butterknife報空指標問題;
- 專案中一些類庫不起作用;
- 在其它Module中使用Butterknfie怎麼使用(主要是解決R資源的問題)
這些都是我在整合的時候遇到的問題,我們一個一個解決上面的問題;
1. 編譯不通過怎麼解決:
只要是配置正確的話(親測可用),不會出現編譯不通過的問題,但是這裡要注意的就是各個配置的位置!!!
1.1 關於配置
- 首先你要在 專案 的build.gradle中新增如下內容:
classpath 'com.jakewharton:butterknife-gradle-plugin:8.4.0'
複製程式碼
請注意這裡使用的不是最新的版本(當前最新版本是8.8.1),這裡使用的是8.4.0這個版本,別問我為什麼!我是真的不知道,如果換成最新的話,各種報錯!請原諒我的無知,就醬紫。。。
整體程式碼如下:
buildscript {
repositories {
google()
jcenter()
}
dependencies {
classpath "com.android.tools.build:gradle:$localGradlePluginVersion"
//為了解決Butterknife元件化開發中的問題,但是這裡只能是8.4.0、8.5.0、8.5.1
classpath 'com.jakewharton:butterknife-gradle-plugin:8.4.0'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
allprojects {
repositories {
google()
jcenter()
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
}
複製程式碼
- 在主專案裡,也就是(app的build.gradle中新增如下內容)
annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1'
複製程式碼
這裡為什麼只新增了一個,沒有新增另一個呢?因為我專案中把基礎類庫分到了相應的module中,所以這裡這麼寫呢?因為**'com.jakewharton:butterknife:8.8.1'這個東西要寫在相應的library module**中,否則會報相應的空指標。所以才把這兩個內容分開的!
整體程式碼如下:
apply plugin: 'com.android.application'
android {
compileSdkVersion rootProject.ext.compileSdkVersion
defaultConfig {
applicationId "com.jinlong.used"
minSdkVersion rootProject.ext.minSdkVersion
targetSdkVersion rootProject.ext.targetSdkVersion
versionCode rootProject.ext.versionCode
versionName rootProject.ext.versionName
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
//引入基礎包,這個基礎包是整體是一些基礎的資料
implementation project(':modules:common')
//引入butterknife
//這個東西一定要放在這個裡面,否則會報錯的(空指標)!
annotationProcessor "com.jakewharton:butterknife-compiler:$butterknifeVersion"
}
複製程式碼
別管我寫的亂七八糟的,那個是便於版本管理的!
- 最後在library module的類庫只新增相應butterknife的引用
api 'com.jakewharton:butterknife:8.8.1'
複製程式碼
細心的朋友可能會問?這個api是個什麼鬼?這裡為什麼用api呢?其實是這樣的,在Android studio 3.1.2之後的版本中(據說是因為編譯更快):
- compile 要用 implementation 或 api 替換
- testCompile 要用 testImplementation 或 testApi 替換
- androidTestCompile 要用 androidTestImplementation 或 androidTestApi 替換 有什麼區別呢?是這樣的,前面是implementation引用的只能在Module中使用,在其他引用這個類庫的module中是使用不了的!而api這個呢,就可以在引用這個類庫的module中去使用!因為我這個是在基礎類庫中使用的,所以只能使用api型別的!就這麼簡單,但是當時我還是弄了好久的!!!嘻嘻。。。
整體程式碼如下:
apply plugin: 'com.android.library'
android {
compileSdkVersion rootProject.ext.compileSdkVersion
defaultConfig {
minSdkVersion rootProject.ext.minSdkVersion
targetSdkVersion rootProject.ext.targetSdkVersion
versionCode rootProject.ext.versionCode
versionName rootProject.ext.versionName
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
//這裡踩了一個坑 implementation 只能是在模組內部使用而api則是其他模組可以使用
//compile 要用 implementation 或 api 替換
//testCompile 要用 testImplementation 或 testApi 替換
//androidTestCompile 要用 androidTestImplementation 或 androidTestApi 替換
implementation fileTree(dir: 'libs', include: ['*.jar'])
api "com.android.support:appcompat-v7:$rootProject.appcompatVersion"
api "com.android.support.constraint:constraint-layout:$rootProject.constraintLayoutVersion"
testImplementation "junit:junit:$rootProject.junitVersion"
androidTestImplementation "com.android.support.test:runner:$rootProject.runnerVersion"
androidTestImplementation "com.android.support.test.espresso:espresso-core:$rootProject.espressoCoreVersion"
//引入butterknife
api "com.jakewharton:butterknife:$butterknifeVersion"
}
複製程式碼
- 元件化開發的時候,要在相應的元件中新增下面這句
apply plugin: 'com.jakewharton.butterknife'
複製程式碼
這句新增在最上面(也就是你判斷是元件還是module的地方),就可以了!
- 下載一個ButterKnifeZelezny外掛
會對你幫助很大的!相信我!!!不懂得可以百度一下,上面有安裝和使用方法
- 在元件中把所有R換成R2就可以了!
以上就可以愉快的解決元件化開發中butterknife的使用了
上面的一些注意事項好好看看,上面的那些問題,在注意事項中都會找到答案的!!!
2018年08月06日補充 其實我覺得元件化還是不要用黃油刀了,為什麼呢?其實我在上面的內容中發現一個事情,當元件化單獨執行Model的時候,所有R2都會報錯,如果說這個時候你要是一個一個改的話,那麼太累了!但如果說你說我不切換的話,也就失去了元件化的意義,利弊自己權衡吧!