Kotlin在Android中的使用(二)-簡化代碼和Kotlin的特性

一、使用Kotlin來簡化findViewById代碼

在Android的代碼中,一個Activity和xml佈局是一個引用關係,Activity中使用界面中的元素必須先用findViewById找到這個元素

在Kotlin中也可以繼續通過findViewById來綁定界面控件,同時還可以通過在gradule中引用applyplugin:'kotlin-android-extensions’來跳過findViewById這個函數直接使用控件,實現步驟如下:

在app的gradule中,添加引用
添加引用
通過佈局中的控件id直接使用,這裏給TextView賦值爲例:
使用
通過按住Ctrl+鼠標焦點,可以看到這個控件id屬於哪個xml佈局,並可點擊跳轉。
Kotlin通過遍歷xml創建臨時的虛擬包來實現引用,在編譯APK時,會自動補充findViewById代碼,最終生成的內容是一樣的,但可以減少開發時findViewById的代碼量。

二、Kotlin特性

1.不需要“;”結尾

在Kotlin語法裏,代碼行不需要用“;”結尾,代碼結束不需要符號

2.“:”的使用

在Java裏,“:”主要在運算符裏出現(for/switch/三元運算符等)。
在Kotlin語法裏“:”的作用比較廣泛
(一) 定義變量類型

var name:String="my name" //變量name爲String類型

(二) 定義參數類型

fun setID(id:Int){ //參數id爲Int類型
}

(三) 定義函數的返回值

fun getAddr(id:Int):String{ //返回值爲String類型
}

(四) 聲明類/接口的繼承

class KotlinActivityUI :AnkoComponent<KotlinActivity>{//繼承AnkoComponent接口
}

(五) 使用Java類

startActivity(Intent(this,KotlinActivity::class.java))//需要用::來使用Java類

3.沒有“new”關鍵字

Kotlin實例化一個對象時不需要new關鍵字

var list: List<String> = ArrayList()
val cat = cat()

4.變量,常量定義,類型推斷

用var定義變量

var name:String="my name"

用val定義常量

val TAG:String="ClassName"

定義可省略數據類型,Kotlin會自動推斷數據類型

var name="my name"
val TAG="ClassName"

5.空指針安全

空指針安全並不是不需要處理空指針,在Kotlin裏,可以用“?”表示可以爲空,也可以用“!!”表示不可以爲空。

 var num:Int?=null

空指針的處理情況,不處理,數據檢查,拋出異常:

val v1 = num?.toInt() //不做處理返回 null
val v2 = num?.toInt() ?:0 //判斷爲空時返回0
val v3 = num!!.toInt() //拋出空指針異常(用“!!”表示不能爲空)

6.函數定義

函數定義使用關鍵字 fun,參數格式爲:參數 : 類型

fun sum(a: Int, b: Int): Int {   // Int 參數,返回值 Int
    return a + b
}

表達式作爲函數體,返回類型自動推斷,用“=”代替return:

public fun sum(a: Int, b: Int): Int = a + b   // public 方法則必須明確寫出返回類型

無返回值可以寫Unit 或者不寫,相當於java的void

fun printSum(a: Int, b: Int): Unit { 
    print(a + b)
}

// 如果是返回 Unit類型,則可以省略(對於public方法也是這樣):
public fun printSum(a: Int, b: Int) { 
    print(a + b)
}

函數的允許空指針安全

fun getAddress(id:Int,name:String) :String?="got it"

7.類檢測及自動轉換

使用 is 運算符檢測一個表達式是否某類型的一個實例(類似於Java中的instanceof關鍵字)。

fun getStringLength(obj: Any): Int? {
  if (obj is String) {
    // 做過類型判斷以後,obj會被系統自動轉換爲String類型
    return obj.length 
  }
fun getStringLength(obj: Any): Int? {
  // 在 `&&` 運算符的右側, `obj` 的類型會被自動轉換爲 `String`
  if (obj is String && obj.length > 0)
    return obj.length
  return null
}

8.in、區間和集合

區間是爲任何可比較類型定義的,用in判斷數字是否在某個區間

if(x in 1..5){ ...//檢查x數值是否在1到5區間

用in判斷集合中是否存在某個元素

if(name in list){...//檢查list中是否有某個元素

用in遍歷整個集合

for (i in 1..4) print(i) // 輸出“1234”

for (i in 4..1) print(i) // 什麼都不輸出

if (i in 1..10) { // 等同於 1 <= i && i <= 10
    println(i)
}

// 使用 step 指定步長
for (i in 1..4 step 2) print(i) // 輸出“13”

for (i in 4 downTo 1 step 2) print(i) // 輸出“42”


// 使用 until 函數排除結束元素
for (i in 1 until 10) {   // i in [1, 10) 排除了 10
     println(i)
}

在遍歷集合時,可以從第N項開始遍歷

for(i in 3..list.size-2){...相當於for (int i = 3; i <= list.size()-2; i++)

倒序遍歷

for(i in list.size downTo 0) {...相當於for (int i = list.size(); i >= 0; i--)

9.用when取代了switch

    fun doWhen(obj:Any){
        when(obj){
            1 -> "is Int"
            in 1..5 -> "between 1-5"
            "str" -> test(obj.toString())
            is dog -> "is a dog object"
            else -> "default"
        }
    }

代碼中的參數類型Any,相當於Java中的Obejct,是Kotlin中所有類的基類

10.單例模式

在Kotlin中,直接從語言提供了單例,關鍵字爲object,如果在androidstudio等IDE中支持了Kotlin,直接輸入singleton會自動生成單例的伴隨對象:

    object SingTest {
        val name = "Daipi"
    }

11.類的結構

java中Object是所有類的基類,而在Kotlin中Any是所有類的基類

Kotlin中object(小寫)代表單例類

Kotlin中沒有new關鍵字

private: 仍然表示私有

protected: 類似private,在子類中也可見

internal: 模塊內可見

inner:內部類

public: 仍然表示共有,但是Kotlin的內部類和參數默認爲public,一般可以不寫

abstract:仍然表示抽象類

interface:仍然表示接口

final關鍵字取消, Kotlin中的類默認不能繼承,通過open關鍵字修飾後纔可繼承

static關鍵字取消,用compaion object的概念替換使用,伴隨對象作爲單例的實體,能繼承擴展,比static更加靈活

java中使用implementextend來實現接口和繼承類,在Kotlin中統一使用“”,繼承類時後面需要**(),中間用“,**”區分

class BaseClass : Activity(), IBinder{ //示例

12.構造函數

java中構造函數一般通過下面的方式並列重載

public className (參數) {...}
public className (參數1,參數2) {...}

在kotlin中,類也可以有多個構造函數,分爲一個主構造函數和多個二級構造函數,主構造函數一般直接寫在類名後面

class dog (srt:String){...}

二級構造函數必須代理主構造函數

class dog (val name:String){
    constructor(name: String,qq: Int):this(name){

    }
}

13.模塊初始化

類初始化時會執行init修飾的**{}**裏面的代碼

class dog (val name:String){
    constructor(name: String,qq: Int):this(name){

    }
    init {
        var qq = 123456
        var myname = name
    }
}

三、總結

以上是一部分kotlin語言的基礎特性,更多詳細的基礎內容可仔細閱讀官方文檔
或在Kotlin教程中學習

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章