第1章 搭建Kotlin開發(fā)環(huán)境

? ? ? ? 本章主要介紹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ǔ)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末埃叭,一起剝皮案震驚了整個濱河市摸恍,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌赤屋,老刑警劉巖立镶,帶你破解...
    沈念sama閱讀 217,542評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異类早,居然都是意外死亡媚媒,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評論 3 394
  • 文/潘曉璐 我一進(jìn)店門涩僻,熙熙樓的掌柜王于貴愁眉苦臉地迎上來缭召,“玉大人,你說我怎么就攤上這事逆日∏断铮” “怎么了?”我有些...
    開封第一講書人閱讀 163,912評論 0 354
  • 文/不壞的土叔 我叫張陵屏富,是天一觀的道長晴竞。 經(jīng)常有香客問我,道長狠半,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,449評論 1 293
  • 正文 為了忘掉前任颤难,我火速辦了婚禮神年,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘行嗤。我一直安慰自己已日,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,500評論 6 392
  • 文/花漫 我一把揭開白布栅屏。 她就那樣靜靜地躺著飘千,像睡著了一般。 火紅的嫁衣襯著肌膚如雪栈雳。 梳的紋絲不亂的頭發(fā)上护奈,一...
    開封第一講書人閱讀 51,370評論 1 302
  • 那天,我揣著相機與錄音哥纫,去河邊找鬼霉旗。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的厌秒。 我是一名探鬼主播读拆,決...
    沈念sama閱讀 40,193評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼鸵闪!你這毒婦竟也來了檐晕?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,074評論 0 276
  • 序言:老撾萬榮一對情侶失蹤蚌讼,失蹤者是張志新(化名)和其女友劉穎辟灰,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體啦逆,經(jīng)...
    沈念sama閱讀 45,505評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡伞矩,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,722評論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了夏志。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片乃坤。...
    茶點故事閱讀 39,841評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖沟蔑,靈堂內(nèi)的尸體忽然破棺而出湿诊,到底是詐尸還是另有隱情,我是刑警寧澤瘦材,帶...
    沈念sama閱讀 35,569評論 5 345
  • 正文 年R本政府宣布厅须,位于F島的核電站,受9級特大地震影響食棕,放射性物質(zhì)發(fā)生泄漏朗和。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,168評論 3 328
  • 文/蒙蒙 一簿晓、第九天 我趴在偏房一處隱蔽的房頂上張望眶拉。 院中可真熱鬧,春花似錦憔儿、人聲如沸忆植。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽朝刊。三九已至,卻和暖如春蜈缤,著一層夾襖步出監(jiān)牢的瞬間拾氓,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評論 1 269
  • 我被黑心中介騙來泰國打工劫樟, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留痪枫,地道東北人织堂。 一個月前我還...
    沈念sama閱讀 47,962評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像奶陈,于是被迫代替她去往敵國和親易阳。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,781評論 2 354

推薦閱讀更多精彩內(nèi)容