前言
Kotlin 在 IO 大會(huì)被 Google 定義為 Android 開(kāi)發(fā)第一級(jí)語(yǔ)言后,在國(guó)內(nèi)各大網(wǎng)站討論簡(jiǎn)直不要太火脑又。
身為程序猿我們要與時(shí)俱進(jìn)暮胧,趁著手上工作不是很忙,抓緊時(shí)間來(lái)趕下時(shí)髦问麸,學(xué)了幾天 kotlin 往衷,發(fā)現(xiàn)它的語(yǔ)法糖既簡(jiǎn)單方便還特別好吃。
Kotlin 用起來(lái)真的是倍兒的爽严卖!
findViewById 的所有姿勢(shì)
在 Android 中我們最討厭寫(xiě) findViewById 席舍,這個(gè)東西又是必須寫(xiě)而且又長(zhǎng),如果控件多哮笆,findViewById 都能有幾十行来颤,不僅難寫(xiě)還占地方。
雖然我們有 butterknife
助陣稠肘,但是 Kotlin 都是一級(jí)開(kāi)發(fā)語(yǔ)言了福铅,更加強(qiáng)大,而且姿勢(shì)很多项阴。
姿勢(shì)一
不依賴認(rèn)識(shí)組件滑黔,純?cè)?/p>
val imgLogo_1 = findViewById(R.id.img_logo) as ImageView
姿勢(shì)二
需要添加官方庫(kù) anko 的支持
val imgLogo_2 = find<ImageView>(R.id.img_logo)
地址:
此處有坑!B撤搿拷沸!
如果直接按照它的文檔添加
compile "org.jetbrains.anko:anko:$anko_version"
會(huì)爆出異常,如下:
Error:Failed to resolve: com.google.android:android:2.3.1
<a href="install.m2.repo">Install Repository and sync project</a>
<a href="openFile:E:/AS_Project/KotlinDemo/app/build.gradle">Open File</a>
<a href="open.dependency.in.project.structure">Show in Project Structure dialog</a>
在 Google 上找了很久薯演,發(fā)現(xiàn)很多人也遇到這個(gè)問(wèn)題撞芍,最后在 Anko 的 github 的 Issues 中找到解決:
//compile "org.jetbrains.anko:anko:$anko_version"
compile("org.jetbrains.anko:anko:$anko_version") {
exclude group: 'com.google.android', module: 'android'
}
在 Project 的 build.gradle 配置如下:
ext.kotlin_version = '1.1.2-4'
ext.anko_version = '0.10.0'
ext.support_version = '25.3.1'
姿勢(shì)三
官方庫(kù) anko 的支持
val imgLogo_3: ImageView = find(R.id.img_logo)
姿勢(shì)四:終極大招
什么都不寫(xiě)要寫(xiě),在代碼里直接使用 xml 中的 id跨扮,可以減少很多代碼
<TextView
android:id="@+id/tv_desc"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
使用方法:
tv_desc.text = "我是最方便的 findViewById "
使用方法比較麻煩序无,需要添加一些依賴和插件:
Step 1:
在 Moudle的 build.gradle
添加:
apply plugin: 'kotlin-android-extensions'
Step 2:
在 Activity 中手動(dòng)導(dǎo)入:
import kotlinx.android.synthetic.main.<layout>.*
<layout> 為你要使用的布局,如:activity_main
import kotlinx.android.synthetic.main.activity_main.*
更多使用參考官方文檔:
https://kotlinlang.org/docs/tutorials/android-plugin.html
Kotlin 的成員變量初始化
Kotlin 的 fbc 姿勢(shì)很多并且簡(jiǎn)單好用衡创,但是我想把變量提升為成員變量時(shí)帝嗡,從 Java 轉(zhuǎn)過(guò)來(lái)發(fā)現(xiàn)變化很大,我也不知道是好還是壞璃氢。
爬坑一
kotlin 中沒(méi)有 new 關(guān)鍵字
private var tvDesc: TextView = null
錯(cuò)誤:kotlin的變量屬性默認(rèn)是不為空哟玷,不能賦值給 null,要加個(gè)問(wèn)號(hào)
private var tvDesc: TextView? = null
?表示可以為空
但是你在代碼中使用時(shí)也要注意巢寡,不能直接這樣使用
tvDesc.text = "hello"
錯(cuò)誤:編譯器不能確定它究竟是不是 null
你使用之前自己要確定這個(gè)變量一定不為空喉脖,如果確定,加上 "!!"
tvDesc!!.text = "hello"
//正確
爬坑二
可以使用 lateinit
關(guān)鍵字進(jìn)行延遲初始化屬性(Late-Initialized Properties)
lateinit 關(guān)鍵字來(lái)延遲初始化的
lateinit var etName: EditText
但是 lateinit
關(guān)鍵字并不能隨便亂用:
- 不可在 null 的對(duì)象上使用
- 只能在 var 使用
- 不能用于構(gòu)造函數(shù)
- 屬性不能有自定義的 getter 和 setting
- 不能應(yīng)用在基本類型上(Int抑月、Float之類)
ps: 如果在一個(gè)延遲初始化的屬性初始化前調(diào)用树叽,會(huì)導(dǎo)致一個(gè)特定異常,調(diào)用的時(shí)候值還沒(méi)有初始化。
爬坑三
lazy
是 Kotlin 的屬性代理的一個(gè)實(shí)例谦絮,它提供了延遲加載的機(jī)制题诵。
private val imgLogo: ImageView by lazy {
find<ImageView>(R.id.img_logo)
}
這里的 lazy 提供了初始化 ImageView 的方法,但是它是一個(gè)延遲的层皱,只有在 ImageView 第一次被使用時(shí)才真正初始化性锭。
雖然第三種方法代碼比較多,但是它優(yōu)秀的避免了方法一和方法二的那些缺點(diǎn)叫胖,推舉使用篷店。