前言:
在项目开发中难免会引入一些第三方插件 如 butterknife , databanding 等id查找相关 最为常见 , 这里简单介绍一下常用的butterknife在多模块中的引入方式 及注意事项
项目(project)下的build.gradle内增加
classpath 'com.jakewharton:butterknife-gradle-plugin:8.5.1'
如:
// Top-level build file where you can add configuration options common to all sub-projects/modules.
apply from: "config.gradle"
buildscript {
repositories {
google()
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.0.1'
//引入butterknife插件
classpath 'com.jakewharton:butterknife-gradle-plugin:8.5.1'
// 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
}
在公共配置中加入butterknife 库
//文件内部使用
def butterknifeLatestReleaseVersion = '8.5.1' //butterknife插件的版本
def supportLibraryVersion = '27.1.1'
//外部使用的安卓版本相关
ext {
applicationId = 'com.yc.androidarchitecture'
compileSdkVersion = 27
targetSdkVersion = 27
minSdkVersion = 19
buildToolsVersion = "27.1.1"
versionCode = 0
versionName = "1.0.0"
}
//compile依赖的第三方库
ext.deps = [
supportv4 : "com.android.support:support-v4:$supportLibraryVersion",
supportv7 : "com.android.support:appcompat-v7:$supportLibraryVersion",
recyclerviewv7 : "com.android.support:recyclerview-v7:$supportLibraryVersion",
constraintlayout : 'com.android.support.constraint:constraint-layout:1.1.2',
//增加butterknife 插件相关的库 (版本用内部定义的方式,方便管理)
butterknife : "com.jakewharton:butterknife:$butterknifeLatestReleaseVersion",
butterknifeCompiler: "com.jakewharton:butterknife-compiler:$butterknifeLatestReleaseVersion",
]
然后在模块中引入插件 `如app主模块
apply plugin: 'com.android.application'
//引入butterknife插件
apply plugin: 'com.jakewharton.butterknife'
android {
compileSdkVersion rootProject.ext.compileSdkVersion
defaultConfig {
applicationId rootProject.ext.applicationId
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(include: ['*.jar'], dir: 'libs')
implementation project(':homelibrary')
implementation project(':mylibrary')
//添加butterknife插件
implementation deps.butterknife
annotationProcessor deps.butterknifeCompiler
}
在app中的用法 大家都很熟悉 直接快捷键 即可 这里不在做阐述
下面说一下在modle中的用法 及遇到的坑
引入方式与 app引入方式一致, 但是如果在公共modle中引入 插件后 在主工程中或者 其他模块中想要用 butterknife插件 还要在添加一次插件 具体的原因可以去官网查看 这里不过详细分解 , 并且在公共模块中最好不要用api引入的方式 否则 在其他模块中 导入包的时候 会提示 在其他库中的包 , 用起来比较麻烦 所以直接用 implementation 只在本库中用即可 这样 butterknife在编译的时候 只编译到当前的modle中
用法 及 注意事项
对于在app中习惯快捷键的同学 在这里就会遇到问题 在用快捷键生成之后 会报错 原因是 butterknife 在modle中用的时候 1是需要8.4版本以上 以及 注解不在是 用 R 而是 用 R2 来寻找控件
但是在在点击事件的时候 如果 用下面的方法 是错误的
@BindView(R2.id.home)
TextView mHome;
@BindView(R2.id.home_to_my)
TextView mHomeToMy;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_home);
ButterKnife.bind(this);
}
@OnClick({R2.id.home, R2.id.home_to_my})
public void onViewClicked(View view) {
//错误写法
//点击事件 如果也用 R2 是不起作用的
switch (view.getId()) {
case R2.id.home:
Toast.makeText(this,"这是首页",Toast.LENGTH_SHORT).show();
break;
case R2.id.home_to_my:
Toast.makeText(this,"跳转到到我的页面",Toast.LENGTH_SHORT).show();
break;
}
}
正确写法:
//在点击事件的id 用 R2 而不是用R
@OnClick({R2.id.home, R2.id.home_to_my})
public void onViewClicked(View view) {
//正确写法
//不能直接用swich 而是用if else 的方式 并且id不能用R2 而是用R
if (view.getId() == R.id.home) {
//点击事件处理
Toast.makeText(this,"这是首页",Toast.LENGTH_SHORT).show();
} else if (view.getId() == R.id.home_to_my) {
//点击事件处理
Toast.makeText(this,"跳转到到我的页面",Toast.LENGTH_SHORT).show();
}
}
注意 :
在各个modle 中都要引入 插件butterknife库 , 如app , homelibrary , mylibraty 等 ,如果公共库 common要用的话也要引入 ,并且注意引入方式要是 implementation 方式
以上就是多模块引入 butterknife 的全部详解
如有不了解的 可以去github下载源码 基础部分为分支2