Android 使用Kotlin開發(一)
本文為自己學kotlin時的一些筆記
Kotlin的特色
Kotlin作為Java的改良,在Android開發中有很多優勢,我們先從相對直觀的介面繪製開始瞭解,然後看看Kotlin的語法特點,再慢慢去接觸更深層次的程式設計思想。
簡化findViewById
我們知道,Android的架構裡,xml佈局檔案和Activity是鬆耦合的,Activity中要使用介面元素,必須藉助R檔案對xml控制元件的記錄,用findViewById找到這個元素。
在Kotlin中我們可繼續使用findViewById去繫結xml佈局中的控制元件:(TextView)findViewById(R.id.hello);
進一步引用Anko之後,可以使用find函式去繫結控制元件:find(R.id.hello),不需要型別轉換
同時,Kotlin還提供一種更激進的方法,通過在gradule中引用applyplugin:’kotlin-android-extensions’,徹底取消findViewById這個函式,具體做法如下:
首先,在app的gradule中,新增引用
然後,在Activity中直接根據id使用介面元素
按住Ctrl鍵,會提示我們這個控制元件詳情
點選後,可以直接跳轉到xml檔案中的控制元件位置,游標會停留在Id處
這種特性令人聯想起C#語言中對介面控制元件的管理,在C#裡,介面的控制元件可以直接呼叫,不需要find,這是因為在建立一個Form1.cs介面檔案時,IDE會自動建立一個對應的額Form1.designer.cs類,在這個類裡,自動管理所有介面控制元件的物件。
Kotlin也是類似的思路,它會遍歷你的xml檔案,建立對應的虛擬包給你引用(用Alt+Enter引用),我們使用的控制元件物件,其實是這個虛擬包裡的控制元件物件。
Kotlin的語法特點
1.在kotlin語法裡,程式碼行不需要“;”結尾。
2.重要的 “:”
在java裡,:主要在運算子裡出現(for switch 三元)
在kotlin中 :的地位大大提升了,他的用途非常廣泛
定義變數型別
var name:String=”my name” //變數name為String型別
定義引數的型別
fun makeTool(id:Int){ //引數id為Int型別}
定義函式的返回值
fun getAddr(id:Int):String{ //返回值為String型別}
宣告類/介面的繼承
class KotlinActivityUI :AnkoComponent{//繼承AnkoComponent介面
來使用Java類
val intent = Intent(this, MainActivity::class.java) //需要用::來使用Java類,注意是兩個“”
3.沒有new
kotlin來例項化一個物件不需要new
var list=ArrayList()
4.變數常量型別推斷
用var定義變數
var name:String=”my name”
用val定義常量(相當於final)
val TAG:String=”ClassName”
由於kotin可以型別推斷上面的2個例子可以簡化成
var name=”my name”
val TAG=”ClassName”
5.初始化和延遲載入
在java裡我們可以自己定義一個變數,但是並不賦值(int和boolean會有預設值)
但是kotlin必須為變數賦值,如果只寫一個變數 卻不賦值 如下
var name
編譯器會報錯,提示你未初始化,你必須賦值0或者null,或者別的一些值
不過有時候我們並不能在定義變數時就初始化他,比如我們在Android中定義一個view控制元件,或者預定義一個介面卡,我們只有在onCreateView()的時候才初始化
針對這種情況,kotlin提供了懶載入lazy機制來解決這個問題,在懶載入機制裡,變數只有在第一次使用時才會初始化,可以這樣寫
lazy只適用於val物件,對於var物件,需要使用lateinit
6.空指標安全
在kotlin裡可以用“?”表示可以為空 用“!!”表示不可以為空
空指標安全並不是不需要處理空指標,你用“?”宣告的某個變數時可以為空的
var num:Int?=null
宣告允許為空時,不能使用型別推斷,必須宣告其資料型別
空指標雖然安全了,但是需要視情況而定,有時候可以為空 有時候做資料檢查,有時候丟擲異常
val v1 =num?.toInt() //不做處理返回 null
val v2 =num?.toInt() ?:0 //判斷為空時返回0
val v3 =num!!.toInt() //丟擲空指標異常(用“!!”表示不能為空)
7.定義函式
在kotlin中可以這樣定義函式
fun 方法名(引數名:型別,引數名:型別…) :返回型別{
}
所以可以這樣寫
由於kotlin可以對函式的返回值進行型別推斷,所以經常使用“=”代替返回型別和“return”關鍵字 上面的程式碼可以寫成
如果我們的函式程式碼只有一行可以簡化成
函式也可以空指標安全,在返回型別後面加“?”即可
有時候函式的型別為Unit 代表java的void 代表沒有返回
在方法沒有返回值時 也可以不寫Unit
8.用is代替了instance of
9.in 區間 集合
在kotlin中有區間的概念 比如2..8就是2到8的整數區間
也可以用in判斷集合是否包含某個元素
for迴圈的使用方法
可以倒序遍歷
當然也可以反轉
可以指定步長(即每次走多少)
10.when代替了switch
11.字串模板 在java中字串的可讀性較差
MessageFormat.format(“{0}xivehribuher{1}xhvihuehewogweg”,para0,para2);
在字串比較長時,你不知道字串要表達什麼
在kotlin中字串可讀性更好
這篇文章就到這裡了 在後續的文章中將會對Kotlin的新特性 一 一介紹
在後續的文章中前三篇將會對Kotlin做一個詳細的講解(篇幅會有點大)
之後將會使用Kotlin寫幾個Android Demo並且會封裝一個網路請求庫
程式碼同步GitHub