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

在組件化開發中Butterknife的使用存在許多的問題,最開始的時候我覺得直接引入Butterknife直接引入到項目中就能夠了呢!可是後來發現不行,會有各類各樣的錯誤,因此用這篇文章記錄一下,防止其餘人採坑!!!android

Butterknife的GitHub官網中是這麼描述關於在Library中集成的!git

效果圖

先來講一下項目,咱們是在公共modules中引入了一些基礎組件的!因此個人主要的一些引用都放在那個基礎模塊中去了!其實這個基礎組件也就至關於一個類庫而已了!github

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

  • 編譯不經過報錯;
  • butterknife報空指針問題;
  • 項目中一些類庫不起做用;
  • 在其它Module中使用Butterknfie怎麼使用(主要是解決R資源的問題)

這些都是我在集成的時候遇到的問題,咱們一個一個解決上面的問題;api

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

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

1.1 關於配置

  1. 首先你要在 項目 的build.gradle中添加以下內容:
classpath 'com.jakewharton:butterknife-gradle-plugin:8.4.0'
複製代碼

請注意這裏使用的不是最新的版本(當前最新版本是8.8.1),這裏使用的是8.4.0這個版本,別問我爲何!我是真的不知道,若是換成最新的話,各類報錯!請原諒個人無知,就醬紫。。。app

項目的位置

總體代碼以下:組件化

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**中,不然會報相應的空指針。因此才把這兩個內容分開的!gradle

項目的位置

總體代碼以下:ui

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"
}
複製代碼

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

  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都會報錯,若是說這個時候你要是一個一個改的話,那麼太累了!但若是說你說我不切換的話,也就失去了組件化的意義,利弊本身權衡吧!

相關文章
相關標籤/搜索