對於發布到 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 注釋掉就可以了。