Kotlin 中 findViewById 的所有姿勢(shì)和初始化時(shí)遇到的那些坑

前言

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)

地址:

https://github.com/Kotlin/anko

此處有坑!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)叫胖,推舉使用篷店。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市臭家,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌方淤,老刑警劉巖钉赁,帶你破解...
    沈念sama閱讀 216,744評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異携茂,居然都是意外死亡你踩,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,505評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)讳苦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)带膜,“玉大人,你說(shuō)我怎么就攤上這事鸳谜∠ヅ海” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,105評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵咐扭,是天一觀的道長(zhǎng)芭挽。 經(jīng)常有香客問(wèn)我,道長(zhǎng)蝗肪,這世上最難降的妖魔是什么袜爪? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,242評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮薛闪,結(jié)果婚禮上辛馆,老公的妹妹穿的比我還像新娘。我一直安慰自己豁延,他們只是感情好昙篙,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,269評(píng)論 6 389
  • 文/花漫 我一把揭開(kāi)白布腊状。 她就那樣靜靜地躺著,像睡著了一般瓢对。 火紅的嫁衣襯著肌膚如雪寿酌。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,215評(píng)論 1 299
  • 那天硕蛹,我揣著相機(jī)與錄音醇疼,去河邊找鬼。 笑死法焰,一個(gè)胖子當(dāng)著我的面吹牛秧荆,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播埃仪,決...
    沈念sama閱讀 40,096評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼乙濒,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了卵蛉?” 一聲冷哼從身側(cè)響起颁股,我...
    開(kāi)封第一講書(shū)人閱讀 38,939評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎傻丝,沒(méi)想到半個(gè)月后甘有,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,354評(píng)論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡葡缰,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,573評(píng)論 2 333
  • 正文 我和宋清朗相戀三年亏掀,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片泛释。...
    茶點(diǎn)故事閱讀 39,745評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡滤愕,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出怜校,到底是詐尸還是另有隱情间影,我是刑警寧澤,帶...
    沈念sama閱讀 35,448評(píng)論 5 344
  • 正文 年R本政府宣布韭畸,位于F島的核電站宇智,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏胰丁。R本人自食惡果不足惜随橘,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,048評(píng)論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望锦庸。 院中可真熱鬧机蔗,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,683評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至牙言,卻和暖如春酸钦,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背咱枉。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,838評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工卑硫, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人蚕断。 一個(gè)月前我還...
    沈念sama閱讀 47,776評(píng)論 2 369
  • 正文 我出身青樓欢伏,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親亿乳。 傳聞我的和親對(duì)象是個(gè)殘疾皇子硝拧,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,652評(píng)論 2 354

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