? ? ? ? 本章主要介紹Kotlin開發(fā)環(huán)境的搭建過程排苍,首先闡述Kotlin語言與Android開發(fā)之間的關(guān)系,接著描述Kotlin開發(fā)工具学密,也就是Android Studio的安裝和啟動步驟淘衙,然后說明SDK及其相關(guān)插件的安裝與升級方法,接著論述如何對Kotlin工程的編譯配置進(jìn)行調(diào)整腻暮,最后演示Kotlin新技術(shù)帶來哪些革命性的變化幔翰。
1.1 Kotlin與Android開發(fā)的關(guān)系
????????本節(jié)主要介紹Kotlin語言與Android開發(fā)之間的關(guān)系漩氨,包括Kotlin的基本概念及其特殊優(yōu)勢,以及Kotlin被谷歌欽定為Android Studio官方開發(fā)語言之后的發(fā)展大事遗增。
1.1.1 Kotlin語言簡介
????????Kotlin是一種基于JVM的新型編程語言叫惊,它完全兼容Java語言,Kotlin代碼可以編譯成Java字節(jié)碼做修,也可以編譯成JavaScript霍狰,方便在沒有JVM的設(shè)備上運行。與流行的Java語言比較饰及,Kotlin具備下列優(yōu)勢:
(1)Kotlin更簡潔蔗坯,完成同樣的業(yè)務(wù)功能,Kotlin代碼通常只有對應(yīng)Java代碼的三分之一燎含。
(2)Kotlin更安全宾濒,它能夠在編碼階段就自動檢測常見的BUG,比如引用了空指針等屏箍。
(3)Kotlin更強大绘梦,它提供了擴展函數(shù)、默認(rèn)參數(shù)赴魁、接口委托卸奉、屬性代理等Java所不具備的高級特性,從而可以完成更復(fù)雜的業(yè)務(wù)邏輯颖御。
1.1.2 Android Studio的官方開發(fā)語言
????????Kotlin很早就被運用到Android開發(fā)之中榄棵,之前一直作為Android Studio的插件提供下載,Android Studio只要安裝了Kotlin插件潘拱,就能用來開發(fā)Kotlin編碼的App工程疹鳄。
????????2017年5月,谷歌宣布將Kotlin納入Android Studio開發(fā)的官方語言芦岂,這意味著Android Studio對Kotlin的編譯支持會大大增強瘪弓,由此掀起了廣大安卓開發(fā)者學(xué)習(xí)Kotlin編程的熱潮。
????????2017年10月盔腔,Android Studio推出3.0正式版杠茬,從3.0版本開始月褥,Android Studio自動集成Kotlin插件弛随,在安裝Android Studio 3.0時就連帶配置了Kotlin的開發(fā)環(huán)境。
????????2017年11月宁赤,Kotlin語言推出1.2發(fā)布版舀透,該版本的Kotlin具備更好的跨平臺特性,編譯性能也比1.1版提高了25%左右决左,同時也更好地支持Android開發(fā)愕够。
1.2 Kotlin開發(fā)工具
????????本節(jié)主要介紹Kotlin開發(fā)環(huán)境的搭建以及Kotlin工程的基本操作走贪,包括安裝Android Studio的具體步驟、啟動Android Studio的詳細(xì)配置惑芭、如何創(chuàng)建一個Kotlin工程坠狡、如何新建各種Kotlin文件等。
1.2.1 安裝Android Studio
????????Android Studio的官方下載頁面是https://developer.android.google.cn/studio/index.html遂跟,在這里可以找到Android Studio的下載地址與使用教程逃沿。首先把最新版本的Android Studio下載到電腦本地,然后雙擊下載完成的Android Studio安裝程序幻锁,彈出安裝歡迎對話框凯亮,如圖1-1所示。單擊該對話框右下方的“Next”按鈕哄尔,跳到下一頁的許可同意對話框假消,單擊“Agree”按鈕,進(jìn)入下一頁的組件選擇對話框岭接,如圖1-2所示富拗。
????????全部勾選,然后單擊“Next”按鈕亿傅,跳轉(zhuǎn)到安裝路徑配置對話框媒峡。建議將Android Studio安裝在除系統(tǒng)盤外的其他磁盤,比如D盤葵擎,如圖1-3所示谅阿,然后單擊“Next”按鈕。在下一個對話框中選擇開始菜單的目錄酬滤,這里使用默認(rèn)的“Android Studio”签餐,如圖1-4所示,然后單擊“Install”按鈕盯串,等待安裝過程進(jìn)行氯檐。
????????安裝過程的進(jìn)度對話框如圖1-5所示,進(jìn)度完成的結(jié)果對話框如圖1-6所示体捏,單擊“Next”按鈕結(jié)束安裝操作冠摄。
????????安裝完畢后彈出一個提示對話框,如圖1-7所示几缭,上面默認(rèn)勾選了“Start Android Studio”河泳,單擊右下角的“Finish”按鈕即可啟動Android Studio。
1.2.2 啟動Android Studio
????????首次安裝Android Studio 3.0會彈出一個提示對話框年栓,如圖1-8所示拆挥,在此開發(fā)者可以選擇從哪個目錄導(dǎo)入之前的Android Studio設(shè)置。為了更好地演示完整的啟動過程某抓,這里選擇最下面的選項“Do not import settings”纸兔,表示不導(dǎo)入任何已有設(shè)置惰瓜,完全重新開始進(jìn)行設(shè)置。
????????選好之后汉矿,單擊提示對話框下方的“OK”按鈕崎坊,Android Studio便執(zhí)行啟動操作,如圖1-9所示洲拇。
????????因為前面選定了不導(dǎo)入任何設(shè)置重新開始流强,所以Android Studio將不會導(dǎo)入任何工程,而是彈出一個向?qū)υ捒蛏氪崾鹃_發(fā)者去進(jìn)行新的設(shè)置打月,如圖1-10所示。單擊“Next”按鈕蚕捉,進(jìn)入下一頁的安裝類型對話框奏篙,如圖1-11所示。
????????這里保持“Standard”選項,單擊“Next”按鈕,進(jìn)入下一個對話框却舀,如圖1-12所示。繼續(xù)單擊“Next”按鈕肺稀,進(jìn)入向?qū)У拇_認(rèn)對話框,如圖1-13所示应民。在該對話框確認(rèn)SDK的安裝路徑是否正確话原,確認(rèn)完畢單擊“Finish”按鈕,等待后續(xù)的SDK下載操作诲锹。
????????接下來的下載對話框會自動到谷歌網(wǎng)站更新組件繁仁,如圖1-14所示。如果電腦本地沒有SDK归园,就繼續(xù)等待下載更新黄虱,如果電腦本地已有現(xiàn)成的SDK,就直接單擊“Cancel”按鈕取消下載庸诱,然后單擊“Finish”按鈕結(jié)束設(shè)置捻浦。最后彈出一個“Welcome to Android Studio”歡迎對話框,如圖1-15所示桥爽。單擊第一項的“Start a new Android Studio project”即可開始你的Android開發(fā)之旅朱灿。
1.2.3 創(chuàng)建Kotlin工程
????????1.2.2小節(jié)提到Android Studio啟動設(shè)置完成之后,會彈出歡迎對話框提示創(chuàng)建新的Android工程聚谁,此時單擊第一項的“Start a new Android Studio project”打開工程創(chuàng)建對話框母剥,如圖1-16所示滞诺。
????????在工程創(chuàng)建對話框中填寫應(yīng)用名稱“Application name”以及公司域名“Company domain”形导,并選擇或填寫Android工程的本地保存路徑“Project location”环疼。注意,創(chuàng)建頁面下方有兩個選項“Include C++ support”和“Include Kotlin support”朵耕,其中勾選“Include C++ support”表示要進(jìn)行NDK/JNI開發(fā)炫隶,但這不是本書的講解范圍,因此不必勾選該復(fù)選框阎曹;勾選“Include Kotlin support”則表示要進(jìn)行Kotlin開發(fā)伪阶,因此務(wù)必勾選該復(fù)選框,才能繼續(xù)后面的Kotlin開發(fā)學(xué)習(xí)处嫌。確認(rèn)對話框中的各項信息都填寫完畢栅贴,單擊下方的“Next”按鈕,進(jìn)入目標(biāo)設(shè)備對話框熏迹,如圖1-17所示檐薯。
????????在目標(biāo)設(shè)備對話框中,Android Studio默認(rèn)勾選了“Phone and Tablet”注暗,表示進(jìn)行手機/平板應(yīng)用開發(fā)坛缕,下面的API最低支持版本原本默認(rèn)是API 15,不過因為如通知的新特性從API 16開始才支持捆昏,所以這里建議把最低版本改為API 16赚楚,接著單擊“Next”按鈕,進(jìn)入初始風(fēng)格對話框骗卜,如圖1-18所示宠页。
????????在初始風(fēng)格對話框中選擇“Empty Activity”,然后單擊下方的“Next”按鈕寇仓,進(jìn)入名稱配置對話框勇皇,如圖1-19所示。
????????在名稱配置對話框保持默認(rèn)設(shè)置焚刺,即活動代碼名稱“Activity Name”仍然填寫“MainActivity”敛摘,布局文件名稱“Layout Name”仍然填寫“activity_name”,然后單擊“Finish”按鈕乳愉,進(jìn)入Android Studio的完整開發(fā)界面兄淫,如圖1-20所示。
????????在編寫代碼的時候蔓姚,Android Studio會自動編譯捕虽。若開發(fā)者想手動重新編譯,則有以下三種編譯方式:
????????(1)選擇菜單“Build”→“Make Project”坡脐,這個是編譯整個項目下的所有模塊泄私。
????????(2)選擇菜單“Build”→“Make Module ***”,這個是編譯指定名稱的模塊。
????????(3)選擇菜單“Build”→“Clean Project”晌端,然后再選擇菜單“Build”→“Rebuild Project”捅暴,這個是先清理項目,再對整個項目重新編譯咧纠。
????????前面新創(chuàng)建的工程當(dāng)然不會出現(xiàn)編譯錯誤蓬痒,直接運行就好了。先把手機通過數(shù)據(jù)線接入開發(fā)電腦的USB上漆羔,再依次選擇菜單“Run”→“Run 'app'”梧奢,彈出目標(biāo)設(shè)備選擇對話框,列表中便會顯示接入的手機設(shè)備演痒,如圖1-21所示亲轨。
????????單擊“OK”按鈕,執(zhí)行測試App的安裝操作鸟顺,不出意外的話瓶埋,一會兒即可在手機上看到測試應(yīng)用的啟動界面,具體效果如圖1-22所示诊沪。
1.2.4 新建Kotlin文件
????????上一小節(jié)創(chuàng)建Kotlin工程后主要生成兩個文件养筒,一個是Kotlin代碼文件MainActivity.kt,另一個是XML布局文件activity_name.xml端姚。其中晕粪,MainActivity.kt就是擴展名為kt的Kotlin格式的代碼文件,相對應(yīng)地渐裸,Java代碼文件的擴展名為java巫湘。這個MainActivity.kt是在創(chuàng)建工程時自動生成的,那么如何在已有工程中創(chuàng)建新的Kotlin文件呢昏鹃?Kotlin代碼文件可以分為兩類:普通的Kotlin文件尚氛、用于頁面Activity的文件,這兩類Kotlin文件擁有各自的創(chuàng)建方式洞渤,具體說明如下阅嘶。
1. 普通的Kotlin文件創(chuàng)建
????????右擊待創(chuàng)建文件的包名,在彈出的快捷菜單中依次選擇“New”→“Kotlin File/Class”载迄,菜單界面如圖1-23所示讯柔。
????????也可在頂部的主菜單欄上依次選擇“New”→“Kotlin File/Class”,菜單界面如圖1-24所示护昧。
????????上述兩種方式都會打開Kotlin文件的創(chuàng)建對話框魂迄,如圖1-25所示。這里在“Name”輸入框填寫文件名稱惋耙,在“Kind”下拉框中可單擊彈出下拉列表捣炬,如圖1-26所示熊昌,根據(jù)要求可選擇對應(yīng)的文件類型(File表示普通文件,Class表示類文件湿酸,Interface表示接口文件婿屹,Enum class表示枚舉文件,Object表示對象文件)稿械,然后單擊“OK”按鈕完成文件創(chuàng)建操作。
2. 用于頁面Activity的文件創(chuàng)建
選中待創(chuàng)建文件的包名冲粤,在頂部的主菜單欄上依次選擇“New”→“Activity”→“Empty Activity”美莫,菜單界面如圖1-27所示。
然后打開活動Activity的創(chuàng)建對話框梯捕,如圖1-28所示厢呵,分別在“Activity Name”和“Layout Name”兩個輸入框中填寫活動名稱與布局名稱,并在下方的源碼語言“Source Language”的下拉列表中選擇“Kotlin”傀顾,表示新創(chuàng)建的Activity代碼采用Kotlin編碼襟铭。
確認(rèn)好新Activity的創(chuàng)建信息,單擊“Finish”按鈕短曾,Android Studio便會自動創(chuàng)建Kotlin代碼文件MainActivity2.kt寒砖,以及與之對應(yīng)的XML布局文件activity_name2.xml。創(chuàng)建后的工程文件結(jié)構(gòu)如圖1-29所示嫉拐。
其實哩都,Kotlin的文件創(chuàng)建還是很簡單的,掌握這些基本的文件操作可以為后面的工具使用打好基礎(chǔ)婉徘。
1.3 SDK安裝與插件升級
????????本節(jié)主要介紹Android Studio 3.0環(huán)境對SDK和插件的安裝升級說明漠嵌,包括如何安裝最新的SDK、如何升級Gradle插件盖呼、如何把Kotlin插件升級到最新版本等儒鹿。
1.3.1 安裝最新版SDK
????????由于目前官方的Android Studio 3.0安裝包沒有自帶SDK,安裝過程也只會去下載Android 8.0的SDK(API 26)几晤,因此如果讀者是第一次安裝Android Studio约炎,就得自己另外安裝最新版本的SDK。首先打開Android Studio蟹瘾,在界面右上角的工具欄中找到“SDK Manager”的圖標(biāo)章钾,如圖1-30所示。
????????單擊該圖標(biāo)热芹,打開Default Settings對話框,如圖1-31所示伊脓,在對話框右側(cè)的SDK列表中勾選最上面的SDK版本魁衙,比如“Android API 27”剖淀,然后單擊右下角的“Apply”按鈕纵隔,命令A(yù)ndroid Studio執(zhí)行該版本SDK的下載操作炮姨。
等待Android Studio下載并安裝最新版本的SDK之后捌刮,重啟Android Studio,即可正常使用該版本的SDK編譯工程舒岸。
1.3.2 升級Gradle插件
????????Android Studio 3.0支持的Gradle插件版本至少為4.1绅作,然而通常App工程自帶的插件版本不能滿足要求,使得Android Studio 3.0打開已有工程時往往要重新下載最新的Gradle插件蛾派,造成漫長的等待時間俄认。與其讓Android Studio老牛破車般地下載Gradle,不如自己動手將最新版的Gradle插件下載到本地洪乍,然后重新配置Gradle插件目錄眯杏。具體步驟如下:
????????步驟01 打開電腦上的下載軟件,輸入Gradle 4.1的下載地址“http://downloads.gradle.org/ distributions/gradle-4.1-all.zip”壳澳,把這個4.1的壓縮包下載到電腦本地役拴,并解壓該壓縮包到指定目錄,比如“D:\Android\gradle-4.1”钾埂。
????????步驟02 打開Android Studio河闰,依次選擇菜單“File”→“Settings”,打開設(shè)置對話框褥紫,在對話框左側(cè)的菜單列表再依次選擇“Build, Execution, Deployment”→“Gradle”姜性,此時對話框右側(cè)展示Gradle插件的配置界面,如圖1-32所示髓考。
????????步驟03 在Gradle配置界面上選中“Use local gradle distribution”,并在下方的“Gradle home:”輸入框中填寫前面gradle-4.1-all.zip的解壓路徑儡炼,例如“D:\Android\gradle-4.1”乌询。
????????步驟04 單擊Gradle配置界面右下方的“OK”按鈕唬党,完成Gradle插件的路徑配置驶拱。
1.3.3 升級Kotlin插件
????????Android Studio雖然從3.0開始集成了Kotlin開發(fā)環(huán)境晌纫,但只是內(nèi)置了某個版本的Kotlin插件翁狐。比如Android Studio 3.0.1集成的Kotlin插件版本為1.1.51,隨著Kotlin語言的更新?lián)Q代,它的插件也得跟著升級辩诞。如何在Android Studio上手動升級Kotlin插件呢译暂?且看下面的具體步驟說明。
????????步驟01 依次選擇菜單“File”→“Settings”伯顶,在彈出窗口右邊的輸入框中填寫“kotlin”祭衩,從已安裝插件里篩選出Kotlin插件,如圖1-33所示劫乱,可見此時默認(rèn)安裝的Kotlin插件版本為1.1.51狭吼。
????????步驟02 插件設(shè)置下方有一排三個按鈕,單擊左邊的“Install JetBrains plugin...”按鈕疲吸,打開遠(yuǎn)程的插件資源窗口。在該窗口左上角的輸入框中填寫“Kotlin”蹂喻,篩選出符合條件的插件列表,如圖1-34所示蔓彩。
????????步驟03 可見下方的插件列表會定位到符合搜索條件的插件位置,單擊“Kotlin”(LANGUAGES),窗口右側(cè)就會展示Kotlin插件的詳細(xì)信息逞壁。發(fā)現(xiàn)遠(yuǎn)程插件庫中的Kotlin最新版本為2017年11月28日推出的1.2版本腌闯,單擊窗口右邊的“Update”按鈕執(zhí)行升級操作斤彼。接著Android Studio開始自動下載Kotlin插件,下載過程如圖1-35所示悦施。
????????步驟04 等待Kotlin下載并更新完畢,此時原來的“Update”按鈕變成了“Restart Android Studio”按鈕,提示需要重啟Android Studio使新插件生效顷窒,如圖1-36所示鞋吉。
????????步驟05 根據(jù)提示關(guān)閉Android Studio馁龟,再次啟動Android Studio,即可在Android Studio使用最新版本的Kotlin插件矢炼。
1.4 Kotlin簡單配置
????????本節(jié)主要介紹Android Studio 3.0環(huán)境對Kotlin的編譯配置說明,包括如何通過菜單調(diào)整Kotlin編譯配置骗绕、如何手工修改編譯配置文件、如何將Java代碼轉(zhuǎn)換成Kotlin代碼等撤缴。
1.4.1 調(diào)整Kotlin編譯配置
????????1.3.3小節(jié)介紹了如何將Kotlin插件升級到最新版本微宝,不過App工程采取的Kotlin編譯版本不一定跟最新版本一致专甩。因為Kotlin允許指定使用某個低版本來編譯工程棺耍,就像Java即使已經(jīng)推出1.9版本,也能使用1.8害幅、1.7甚至1.6來編譯Java工程。
????????調(diào)整App工程的Kotlin編譯版本很簡單邑遏,依次選擇菜單“File”→“Settings”纪吮,在打開的窗口左側(cè)菜單列表選中“Kotlin Compiler”碾盟,窗口右邊便會打開Kotlin編譯配置界面,如圖1-37所示估盘。
????????可以看到箫踩,“Language version”和“API version”目前選的都是1.1,表示當(dāng)前App工程采用的Kotlin編譯版本為1.1慨削。
1.4.2 修改編譯配置文件
????????只看菜單界面上的Kotlin編譯配置還是不夠直截了當(dāng)玫芦,到底這個編譯版本是在哪個文件里面配置的呢桥帆?先打開工程的編譯配置文件build.gradle看看,該文件內(nèi)容如圖1-38所示师郑。
????????圖1-38所示的build.gradle文件內(nèi)容是下面這樣的:
buildscript {
? ? //指定Kotlin插件的版本环葵,這里是Android Studio 3.0.1默認(rèn)的1.1.51
? ? ext.kotlin_version = '1.1.51'
? ? repositories {
? ? ? ? google()
? ? ? ? jcenter()
? ? }
? ? dependencies {
? ? ? ? classpath 'com.android.tools.build:gradle:3.0.1'
? ? ? ? //指定Kotlin插件的路徑
? ? ? ? classpath "org.jetbrains.kotlin:kotlin-gradle-plugin: $kotlin_version"
? ? ? ? // NOTE: Do not place your application dependencies here; they belong
? ? ? ? // in the individual module build.gradle files
? ? }
}
????????正如圖1-38框中標(biāo)記的那樣调窍,Kotlin工程的編譯配置文件比Java編寫的App工程多了兩處修改宝冕,說明如下:
????????(1)定義了一個外部變量ext.kotlin_version,其值為Kotlin編譯版本號“1.1.51”地梨。
????????(2)指定了Kotlin插件的編譯路徑赖钞,即“org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_ version”洋访。
????????可是僅僅修改工程級別的build.gradle是不夠的善镰。再看看模塊級別的build.gradle桥状,該文件內(nèi)容如圖1-39和圖1-40所示蔗崎,其中圖1-39所示為文件開頭部分的截圖,圖1-40所示為文件末尾dependencies塊的截圖酷师。
????????注意圖1-39和圖1-40框中的部分荡碾,這里依然有兩個地方與眾不同矛缨,說明如下:
????????(1)文件開頭增加了兩個插件,即'kotlin-android'和'kotlin-android-extensions'呀酸,表示該模塊會運用Kotlin插件功能倾哺。補充Kotlin插件聲明后的文件頭部如下所示:
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
????????(2)文件末尾的dependencies塊增加了Kotlin插件庫的編譯聲明昧穿,具體聲明語句如下所示:
implementation "org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version"
????????綜上所述锁保,Kotlin工程與Java編寫的App工程相比,一共要調(diào)整兩個build.gradle的4處編譯配置棠涮,方能正常支持Kotlin代碼的編譯運行酝枢。
1.4.3 Java代碼轉(zhuǎn)Kotlin代碼
? ??????前面介紹了Kotlin工程的編譯配置說明,如果現(xiàn)在有一個Java編碼的App工程疲牵,要如何將其轉(zhuǎn)換為Kotlin工程呢家妆?
? ??????假設(shè)讀者目前還沒有Kotlin基礎(chǔ),那么按照App開發(fā)的常規(guī)流程冕茅,先創(chuàng)建一個新模塊伤极,依次選擇菜單“File”→“New”→“New Module”,然后一路單擊“Next”按鈕完成模塊創(chuàng)建姨伤。再按照“1.4.2修改編譯配置文件”的說明哨坪,給這個新模塊添加Kotlin編譯支持。接著打開MainActivity.java乍楚,這個文件的內(nèi)容再熟悉不過了当编,就是最簡單的幾行Java代碼,如下所示:
????????public class MainActivity extends AppCompatActivity {
? ? ????????@Override
? ????????? protected void onCreate(Bundle savedInstanceState) {
? ? ????????? ? super.onCreate(savedInstanceState);
? ????????? ? ? setContentView(R.layout.activity_main);
????????? ? }
? ? ? ? }
????????現(xiàn)在我們要移花接木徒溪,把Java代碼轉(zhuǎn)換為Kotlin代碼忿偷。先選中MainActivity.java,再到主界面上依次選擇菜單“Code”→“Convert Java File to Kotlin File”臊泌,菜單位置如圖1-41所示鲤桥。
? ??????代碼轉(zhuǎn)換完畢,原來的MainActivity.java變成了MainActivity.kt缺虐,文件內(nèi)容也變成了如下所示的Kotlin代碼:
? ? ? ? class MainActivity : AppCompatActivity() {
? ? ? ? ? ? override fun onCreate(savedInstanceState: Bundle?) {
? ? ? ? ? ? ? ? super.onCreate(savedInstanceState)
? ? ? ? ? ? ? ? setContentView(R.layout.activity_main)
? ? ? ? ? ? }
? ? ? ? }
? ??????看起來芜壁,這個Kotlin的語法與Java似曾相識,但又有所不同高氮。若想解釋Kotlin的詳細(xì)語法規(guī)則慧妄,可參見本書第2章到第5章的語法部分。這里先把DEMO跑起來再說剪芍,依次選擇菜單“Run”→“Run 'hello'”啟動應(yīng)用塞淹,正常的話,可在接入的模擬器或者真機上看到“Hello World罪裹!”饱普,如圖1-42所示运挫。
? ??????怎么樣,這可是一個貨真價實的用Kotlin開發(fā)的App套耕,都說萬事開頭難谁帕,搭建好Kotlin的開發(fā)環(huán)境,只是萬里長征的第一步冯袍,在下面的章節(jié)中匈挖,我們將繼續(xù)學(xué)習(xí)如何使用Kotlin進(jìn)行Android開發(fā)。
1.5 Kotlin相關(guān)技術(shù)
? ??????本節(jié)主要介紹Kotlin語言在編碼過程中運用的一些相關(guān)技術(shù)康愤,首先對Kotlin代碼與Java代碼進(jìn)行編程效率的比較儡循,然后分別闡述Kotlin采用的Anko庫以及Lambda表達(dá)式的相關(guān)概念以及具體用法。
1.5.1 Kotlin代碼與Java代碼PK
? ??????前面介紹了如何搭建Kotlin的開發(fā)環(huán)境征冷,可是這個開發(fā)環(huán)境依然基于Android Studio择膝,而在Android Studio上使用Java進(jìn)行編碼本來就是理所應(yīng)當(dāng)?shù)模伪剡€要專門弄個Kotlin检激,這個Kotlin相比Java到底有哪些好處呢肴捉?
? ??????我們可以把Kotlin看作是Java的升級版,它不但完全兼容Java呵扛,而且極大地精簡了代碼語法每庆,從而使開發(fā)者專注于業(yè)務(wù)邏輯的編碼,無須在煩瑣的代碼框架之間周旋今穿。當(dāng)然缤灵,若想充分運用Kotlin的優(yōu)異特性,除了導(dǎo)入Kotlin的核心庫外蓝晒,還得導(dǎo)入Kotlin的擴展庫與Anko庫腮出。具體到編譯配置文件,則要進(jìn)行以下兩處修改:
? ??????(1)打開項目的build.gradle芝薇,補充添加Anko庫的版本號聲明胚嘲,以及Kotlin擴展庫的路徑,完整的編譯配置如下所示:
? ? ? ? buildscript {
? ? ? ? ? ? ext.kotlin_version = "1.2" //指定Kotlin的編譯版本號
? ? ? ? ? ? ext.anko_version = "0.9" //指定Anko庫的版本號
? ? ? ? ? ? repositories {
? ? ? ? ? ? ? ? google()
? ? ? ? ? ? ? ? jcenter()
? ? ? ? ? ? }
? ? ? ? ? ? dependencies {
? ? ? ? ? ? ? ? classpath 'com.android.tools.build:gradle:3.0.1'
? ? ? ? ? ? ? ? classpath "org.jetbrains.kotlin:kotlin-gradle-plugin: $kotlin_version"
? ? ? ? ? ? ? ? classpath "org.jetbrains.kotlin:kotlin-android-extensions: $kotlin_version"
? ? ? ? ? ? }
? ? ? ? }
? ??????(2)打開模塊的build.gradle洛二,在文件開頭補充添加Kotlin的擴展插件馋劈,配置添加示例如下:
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
? ??????接著在dependencies節(jié)點下補充添加Kotlin與Anko插件的編譯說明,如下所示:
? ? ? ? //Android Studio 3.0開始使用implementation晾嘶,2.*版本使用compile
? ? ? ? compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
? ? ? ? compile "org.jetbrains.anko:anko-common:$anko_version"
? ??????編譯配置修改完畢妓雾,接下來嘗試進(jìn)行簡單的Kotlin編碼,看看Kotlin的代碼究竟有多么的簡練垒迂。
? ??????首先按照前面“1.2.4 新建Kotlin文件”小節(jié)的描述械姻,給該模塊創(chuàng)建一個名稱為EasyActivity.kt的Kotlin文件,對應(yīng)的布局文件名則為activity_easy.xml机断。然后給布局文件activity_easy.xml添加幾個TextView和Button控件楷拳,布局比較簡單绣夺,可參考本書下載資源中的源代碼。
? ??????接下來是本小節(jié)的重點欢揖,以前開發(fā)者在操縱控件時陶耍,都要先通過findViewById方法獲得控件對象,再調(diào)用相關(guān)函數(shù)設(shè)置對象屬性浸颓。比如現(xiàn)在有一個名為tv_hello的TextView控件物臂,準(zhǔn)備在代碼中把tv_hello的顯示文本改為“你好呀”旺拉,如果用Java編碼产上,就是下面幾行代碼:
? ? ? ? TextView tv_hello = (TextView) findViewById(R.id.tv_hello);
? ? ? ? tv_hello.setText("你好呀");
? ??????如果用Kotlin修改文本這個功能,實現(xiàn)會是怎么樣的呢蛾狗?下面就讓我們實驗一下晋涣。首先在EasyActivity.kt代碼開頭補充下面一行:
? ??????import kotlinx.android.synthetic.main.activity_easy.*
? ??????這行導(dǎo)入語句的目的是引進(jìn)Kotlin的控件變量自動映射功能,接下來的代碼就無須再調(diào)用findViewById方法沉桌,直接把控件ID當(dāng)作控件對象使用即可谢鹊。比如修改TextView的顯示文本,采用Kotlin編碼只要下面一行:
? ??????tv_hello.setText("你好呀")
? ??????如此一來留凭,原來的兩行代碼精簡到一行代碼佃扼,去掉了原先獲取控件對象的冗余代碼。然而Kotlin的便利性并不僅限于此蔼夜,它對控件甚至都無須調(diào)用set***/get***方法兼耀,而允許直接修改/獲取控件的屬性值,如設(shè)置文本這個功能求冷,可以繼續(xù)簡化為下面這行代碼:
? ??????tv_hello.text = "你好呀"
? ??????進(jìn)一步簡化之后瘤运,原代碼的“set”與兩個括號都被去除,但是新代碼反而更容易理解了匠题。
? ??????也許有人說拯坟,Kotlin在這里只精簡了一行代碼,不見得比Java有多大優(yōu)勢韭山,那就繼續(xù)進(jìn)行其他常見功能的PK郁季,有道是五局三勝,贏得多才足以服眾钱磅。上面的第一局為修改控件文本的PK梦裂,結(jié)果是Kotlin小勝;接下來再設(shè)四局PK续搀,其中第二局為點擊監(jiān)聽器的處理塞琼。Button是Android的常用按鈕控件,代碼中經(jīng)常要處理Button控件的點擊事件禁舷,下面的Java代碼就是響應(yīng)Button點擊的一個例子:
final Button btn_click = (Button) findViewById(R.id.btn_click);
btn_click.setOnClickListener(new View.OnClickListener() {
? ? @Override
? ? public void onClick(View v) {
? ? ? ? btn_click.setText("您點了一下下");
? ? }
});
? ??????其實這個響應(yīng)功能很簡單彪杉,僅僅在點擊按鈕時修改按鈕文本而已毅往,可是因為Java需要實現(xiàn)點擊監(jiān)聽器,所以無奈還得寫好幾行的匿名類代碼派近。如果使用Kotlin實現(xiàn)相同的功能攀唯,又是怎樣的呢?且看下面的Kotlin代碼:
btn_click.setOnClickListener { btn_click.text="您點了一下下" }
? ??????不得了了渴丸,Kotlin只需一行代碼就完事侯嘀,想不到吧,此局Kotlin完勝谱轨。
? ??????第三局換個Button控件的長按事件戒幔,下面的Java代碼是響應(yīng)Button長按的一個例子:
final Button btn_click_long = (Button) findViewById(R.id.btn_click_long);
btn_click_long.setOnLongClickListener(new View.OnLongClickListener() {
? ? @Override
? ? public boolean onLongClick(View v) {
? ? ? ? btn_click_long.setText("您長按了一小會");
? ? ? ? return true;
? ? }
});
? ??????可以看到Java代碼依舊冗長,再看看Kotlin代碼如何接招:
btn_click_long.setOnLongClickListener { btn_click_long.text="您長按了一小會"; true }
? ??????Kotlin仍舊一行代碼搞定土童,真是叫人刮目相看诗茎,此局Kotlin依然完勝。
? ??????第四局咱不比監(jiān)聽器了献汗,Java在匿名類這塊很吃虧敢订,那來比另一種常用的Toast提示功能,該功能的Java代碼只有一行:
final Button btn_toast = (Button) findViewById(R.id.btn_toast);
btn_toast.setOnClickListener(new View.OnClickListener() {
? ? @Override
? ? public void onClick(View v) {
? ? ? ? Toast.makeText(EasyJavaActivity.this, "小提示:您點了一下下", Toast.LENGTH_SHORT).show();
? ? }
});
? ??????上面外層的點擊監(jiān)聽器請忽略罢吃,正宗的Toast代碼真的只有一行楚午,且看Kotlin怎么拆招:
btn_toast.setOnClickListener { toast("小提示:您點了一下下") }
? ??????哈哈,Kotlin連同監(jiān)聽器的代碼尿招,比Java的一行Toast代碼都要少矾柜,此局Kotlin繼續(xù)小勝。
? ??????可是為什么Kotlin的toast函數(shù)不區(qū)分顯示時長呢泊业?原來toast方法默認(rèn)為短時顯示把沼,即Toast.LENGTH_SHORT。這下Java方竊喜吁伺,雖然我的代碼比較長饮睬,但是足夠靈活呀,想要短一點就LENGTH_SHORT篮奄,想要長一點就LENGTH_LONG捆愁。正好第五局比試Toast的長時提示,該功能的Java代碼也只有一行Toast:
final Button btn_toast_long = (Button) findViewById(R.id.btn_toast_long);
btn_toast_long.setOnLongClickListener(new View.OnLongClickListener() {
? ? @Override
? ? public boolean onLongClick(View v) {
? ? ? ? Toast.makeText(EasyJavaActivity.this, "長提示:您長按了一小會", Toast.LENGTH_LONG).show();
? ? ? ? return true;
? ? }
});
? ??????現(xiàn)在Kotlin沒法調(diào)用toast函數(shù)了吧窟却,Java洋洋自得總算能夠扳回一局昼丑,誰料Kotlin大喝一聲“看我來”:
btn_toast_long.setOnLongClickListener { longToast("長提示:您長按了一小會"); true }
? ??????真是未曾想到,Kotlin另外有一個longToast招式夸赫,僅僅多了4個字母而已菩帝,于是此局Kotlin理應(yīng)小勝。
? ??????五局PK下來,Kotlin大獲全勝呼奢,Java潰不成軍宜雀,直教人長吁短嘆“長江后浪推前浪,前浪死在沙灘上”握础。
1.5.2 Anko庫
? ??????Anko是使用Kotlin語言編寫的一個Android增強庫辐董,它用于簡化Android開發(fā)時的Kotlin代碼,使得開發(fā)者只用較少的Kotlin代碼便能表達(dá)完整的編程含義禀综,同時也讓App代碼變得更加簡潔易懂简烘。
? ??????例如1.5.1小節(jié)的toast和longToast,這兩個函數(shù)就在Anko庫中定義定枷。對于toast函數(shù)孤澎,它在Anko庫中的原始定義是下面這樣的:
fun Context.toast(message: CharSequence) = Toast.makeText(this, message, Toast.LENGTH_SHORT).show()
? ??????對于longToast函數(shù),它在Anko庫中的原始定義是下面這樣的:
fun Context.longToast(message: CharSequence) = Toast.makeText(this, message, Toast.LENGTH_LONG).show()
? ??????注意到Anko庫的Toasts.kt文件是給Context類添加了擴展函數(shù)toast和longToast依鸥,這意味著凡是繼承了Context的類(包括Activity亥至、Service等),均可在類內(nèi)部代碼直接調(diào)用toast和longToast方法實現(xiàn)彈窗提示效果贱迟,而不必額外聲明工具類對象。
? ??????為了正常地使用toast和longToast函數(shù)絮供,要在代碼文件頭部加上下面兩行導(dǎo)入語句:
import org.jetbrains.anko.toast
import org.jetbrains.anko.longToast
? ??????另外衣吠,修改項目的build.gradle,在buildscript節(jié)點中補充下面一行的Anko庫版本號定義:
ext.anko_version = "0.9" //指定Anko庫的版本號
? ??????同時壤靶,修改模塊的build.gradle缚俏,在dependencies節(jié)點中補充下述的anko-common包編譯配置:
compile "org.jetbrains.anko:anko-common:$anko_version"
? ??????當(dāng)然,讀者剛看到這里的時候贮乳,應(yīng)該還不具備多少Kotlin基礎(chǔ)忧换,尚無法理解Kotlin的擴展函數(shù)與類繼承的用法。此處介紹Anko庫的目的只是告訴讀者有這么一種增強庫,具體的Kotlin語法在后續(xù)章節(jié)會進(jìn)行詳細(xì)和深入的介紹。
1.5.3 Lambda表達(dá)式
? ??????Lambda表達(dá)式其實是一個匿名函數(shù)歼秽,匿名函數(shù)指的是:它是一個沒有名字的函數(shù)漓糙,但函數(shù)體的內(nèi)部代碼是完整的∥噬鳎可是常規(guī)的函數(shù)調(diào)用都必須指定函數(shù)名稱,既然匿名函數(shù)不存在函數(shù)名稱,那么其他地方怎樣調(diào)用它呢梢夯?為解答這個問題,先來看看Android處理按鈕點擊事件的Java代碼片段:
btn_click.setOnClickListener(new View.OnClickListener() {
? ? @Override
? ? public void onClick(View v) {
? ? ? ? btn_click.setText("您點了一下下");
? ? }
});
? ??????上面的代碼段摘錄于之前的“1.5.1 Kotlin代碼與Java代碼PK”小節(jié)晴圾,顯然Java的這種寫法太過啰嗦颂砸,既創(chuàng)建類實例又重寫onClick函數(shù)。其實此處的業(yè)務(wù)邏輯很簡單,僅僅是發(fā)生點擊事件時修改一下按鈕文本就好了人乓,監(jiān)聽代碼何必要搞得這么復(fù)雜呢梗醇?出現(xiàn)該現(xiàn)象的緣由是,Java是一個純面向?qū)ο蟮恼Z言撒蟀,因此它必須按照面向?qū)ο蟮耐暾麑懛ɡ侠蠈崒嵉乩^承類叙谨,然后聲明類實例,最后重載函數(shù)保屯。
? ??????Java設(shè)計人員為了保持Java代碼的嚴(yán)謹(jǐn)性和連貫性手负,對于上述代碼的情況一直只能這么處理。經(jīng)過多年努力姑尺,Java的設(shè)計者終于找到了符合Java編程習(xí)慣的Lambda表達(dá)式竟终,也就是簡化后的Java編碼,其中把多余的實例聲明與函數(shù)重載部分統(tǒng)統(tǒng)去掉切蟋,只留下與業(yè)務(wù)相關(guān)的核心代碼统捶,從而形成了下面的Lambda表達(dá)式代碼:
btn_click.setOnClickListener((View v) -> {
? ? ? ? btn_click.setText("您點了一下下");
});
? ??????初步精簡后的Lambda表達(dá)式代碼只保留了onClick函數(shù)的輸入?yún)?shù)與函數(shù)內(nèi)部代碼(二者之間通過“->”連接),連函數(shù)名稱也被省略掉了柄粹。注意到函數(shù)內(nèi)部未使用輸入?yún)?shù)v喘鸟,所以完全可以把沒用的輸入?yún)?shù)去掉,于是上面的Lambda代碼便進(jìn)一步簡化成下面這樣:
btn_click.setOnClickListener({
? ? ? ? btn_click.setText("您點了一下下");
});
? ??????雖然以上的Lambda代碼已經(jīng)夠短了驻右,可是仍舊存在改進(jìn)的空間什黑。仔細(xì)觀察發(fā)現(xiàn)setOnClickListener函數(shù)在圓括號內(nèi)部又包了一層花括號,兩層括號緊緊貼在一起純屬浪費堪夭,因此完全可以把兩層括號簡寫為一層花括號愕把,簡寫后的Lambda代碼如下所示:
btn_click.setOnClickListener{
? ? ? ? btn_click.setText("您點了一下下");
};
? ??????至此,采取Lambda表達(dá)式的Java點擊事件處理代碼已經(jīng)跟下面的Kotlin代碼很接近了:
btn_click.setOnClickListener { btn_click.text="您點了一下下" }
? ??????Java從1.8開始支持Lambda表達(dá)式森爽,如果Android Studio采取JDK 1.7進(jìn)行App開發(fā)恨豁,Java編碼是不能使用Lambda表達(dá)式的。由于Kotlin從一誕生就支持Lambda表達(dá)式爬迟,因此并不在乎JDK版本是1.7還是1.8橘蜜,只要采用最新版本的Kotlin編譯,都能正常使用Lambda表達(dá)式雕旨。
1.6 小結(jié)
? ??????本章主要介紹了Kotlin開發(fā)環(huán)境(即Android Studio)的環(huán)境搭建扮匠,包括Kotlin與Android開發(fā)的關(guān)系、如何安裝與配置Android Studio凡涩、如何創(chuàng)建Kotlin工程與Kotlin文件棒搜、如何升級和配置Android Studio上的Kotlin插件、如何調(diào)整Kotlin工程的編譯配置活箕,并借此初步認(rèn)識到利用Kotlin開發(fā)App帶來的巨大好處力麸。
? ??????通過本章的學(xué)習(xí),讀者應(yīng)該學(xué)會基于Android Studio環(huán)境的Kotlin基本操作步驟,能夠正確配置克蚂、編譯和運行Kotlin編碼的App工程闺鲸,并具備進(jìn)一步提高的學(xué)習(xí)基礎(chǔ)。