对于发布到 github 的第三方控件,可以简单地在 build.gradle 中添加引用,不过如果要想修改其功能,就需要下载源代码并导入到自己的工程中了。
下面以 https://github.com/JZXiang/TimePickerDialog 为例,记录下导入源代码的过程:
方式一 导入源码到本地项目中
此方式源代码中的src与res文件夹都位于控件的文件夹下,不必逐一导入,但是需要修改控件的 build.gradle 文件
一、下载源代码压缩包 TimePickerDialog-master.zip 并解压到本地,文件夹结构如下:
其中 TimePickerDialog 文件夹是控件的源代码,其中结构如下:
二、修改控件源代码文件夹(TimePickerDialog 文件夹)下的 build.gradle 文件,因为原作者的编译环境与我们的不一致,我们要使用自己的编译环境来编译控件的源代码,所以要把 build.gradle 中相关内容替换成本地版本 build.gradle 中的内容,以防出现版本错误。
apply plugin: 'com.android.library' // 控件以 library 结尾,App 以 application 结尾
android {
// 以下内容要换成本地 build.gradel 的内容
compileSdkVersion 23
buildToolsVersion "23.0.2"
defaultConfig {
minSdkVersion 8
targetSdkVersion 23
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
// 以下三行要换成本地 build.gradel 的内容
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:appcompat-v7:23.3.0'
compile 'com.android.support:support-v4:23.3.0'
}
apply from: 'bintray.gradle' // 本地程序编译时未使用 bintray.gradle,此行可删掉
在本地新建一个 android 项目,正常运行后,打开 app 文件夹下的 build.gradle,从中提取相关行用来替换控件 build.gradle 中的相应内容:
apply plugin: 'com.android.application'
android {
// 以下内容为编译版本,全部复制到控件的 build.gradle 中
compileSdkVersion 28
buildToolsVersion "31.0.0"
defaultConfig {
applicationId "com.example.appimport" // 此行是 app 独有的,复制到控件时要删掉,否则会报“重复的程序ID”
minSdkVersion 15
targetSdkVersion 28
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
// 只复制以下三行就行
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.android.support:appcompat-v7:28.0.0'
implementation 'com.android.support.constraint:constraint-layout:1.1.3'
// 下面三行与调试有关,不必复制
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
}
三、导入到现有的工程中
在 AndroidStudio 中选择菜单 File -> New -> Import module...,选择 TimePickerDialog 文件夹导入。
四、在工程上添加代码依赖
在 AndroidStudio 中选择菜单 File -> Project Structure...
这样就可以在自己的程序中使用该控件了,也可以对其源代码进行修改了。
方式二 直接在本地项目中创建包,将控件源代码加入其中
此方式不涉及 build.gradle 的版本问题,不足之处是如果控件包含 res 文件夹的话,需要逐一解决 R 类的问题
以 TimePickerDialog 为例,其完整的包名为 com.jzxiang.pickerview.TimePickerDialog,在本地项目的 java 文件夹上点右键,新建包,包名称为“com.jzxiang.pickerview”,注意,不包含“TimePickerDialog”,然后将控件“com\jzxiang\pickerview”下的所有文件及子文件夹复制到新建的包文件夹下。如果控件源代码包含子文件夹,此时不用逐级建立包,复制过来后子包中的类都可以被正确引用。
对于只有 java 代码的控件,这样做就可以正确使用了。但是如果控件还包含 xml 资源,就比较麻烦(目前没找到更合适的方法)。对于资源文件,如果本地项目中不包含同名文件,可以直接将 xml 复制到本地项目的 res 文件夹下,如果控件中的 xml 与本地项目同名,可以将其内容复制追加到本地项目的同名文件中。在编译运行时,会出现引用 R 类的错误,因为在控件的源代码中是以 import com.jzxiang.pickerview.R 的形式引用的资源,现在我们已经将资源复制到本地项目中,因此直接将 import com.jzxiang.pickerview.R 注释掉就可以了。