记一次组件化开发中使用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都会报错,若是说这个时候你要是一个一个改的话,那么太累了!但若是说你说我不切换的话,也就失去了组件化的意义,利弊本身权衡吧!

相关文章
相关标签/搜索