文章目錄
一、使用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中使用implement和extend來實現接口和繼承類,在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
}
}