記一次元件化開發中使用ButterKnife的使用

筆墨Android發表於2018-08-03

在元件化開發中Butterknife的使用存在許多的問題,最開始的時候我以為直接引入Butterknife直接引入到專案中就可以了呢!但是後來發現不行,會有各種各樣的錯誤,所以用這篇文章記錄一下,防止其他人採坑!!!

Butterknife的GitHub官網中是這麼描述關於在Library中整合的!

效果圖

先來說一下專案,我們是在公共modules中引入了一些基礎元件的!所以我的主要的一些引用都放在那個基礎模組中去了!其實這個基礎元件也就相當於一個類庫而已了!

先說一下你可能遇到的問題:

  • 編譯不通過報錯;
  • butterknife報空指標問題;
  • 專案中一些類庫不起作用;
  • 在其它Module中使用Butterknfie怎麼使用(主要是解決R資源的問題)

這些都是我在整合的時候遇到的問題,我們一個一個解決上面的問題;

1. 編譯不通過怎麼解決:

只要是配置正確的話(親測可用),不會出現編譯不通過的問題,但是這裡要注意的就是各個配置的位置!!!

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
}
}
複製程式碼
  1. 在主專案裡,也就是(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"
}
複製程式碼

別管我寫的亂七八糟的,那個是便於版本管理的!

  1. 最後在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"
}
複製程式碼
  1. 元件化開發的時候,要在相應的元件中新增下面這句
apply plugin: 'com.jakewharton.butterknife'
複製程式碼

這句新增在最上面(也就是你判斷是元件還是module的地方),就可以了!

  1. 下載一個ButterKnifeZelezny外掛

會對你幫助很大的!相信我!!!不懂得可以百度一下,上面有安裝和使用方法

  1. 在元件中把所有R換成R2就可以了!

以上就可以愉快的解決元件化開發中butterknife的使用了

上面的一些注意事項好好看看,上面的那些問題,在注意事項中都會找到答案的!!!


2018年08月06日補充 其實我覺得元件化還是不要用黃油刀了,為什麼呢?其實我在上面的內容中發現一個事情,當元件化單獨執行Model的時候,所有R2都會報錯,如果說這個時候你要是一個一個改的話,那麼太累了!但如果說你說我不切換的話,也就失去了元件化的意義,利弊自己權衡吧!

相關文章