Kotlin系列--不用findViewById()的Kotlin怎生書寫?

前面我們介紹了Kotlin的基本用法,基本用法只是給我們展示了Kotlin最為簡易,最為和善的一面。既然能夠被Google欽點,那也說明Kotlin有其不平凡的偉大之處。下面依然是先介紹部分Kotlin知識,再練習一下Kotlin在Android中的使用,都是從官網學來的,強烈建議官網學習中文英文。文中若有理解失誤之處,歡迎批評指正。

一:Kotlin習慣用法

(1):創建集合
在Kotlin的世界里,如果我們需要對象,那么基本上不再需要與new打照面了。var 我們在前面介紹中知道,她是可以定義變量和常量的一個關鍵字。比如定義一個整型的變量。

var a=5 //自動推倒,錯了,應該是自動推導
var a:Int=5 //顯示指定變量a為Int類型

同樣,我們也可以用var來定義一個集合

var intList=listOf(-3,-2,-1,0,1,2,3)

這樣我們就可以得到一個整型的集合。我們也可以

var strList=listOf("kot","lin")

生成一個字符串集合。同時我們還可以對這些集合進行過濾操作,比如

var tempList=intList.filter{it>1}

上面這個語句的意思是,在剛才生成的集合基礎上,調用一個filter函數,該函數有個過濾作用,可以將數組中不滿足條件的元素過濾掉,然后將滿足條件的元素生成一個新的集合。其中的it不能更換為其他的阿貓阿狗,還有注意是花括號,這里是約定俗成的寫法。這個語句的另一種寫法是

var tempList=intList.filter{x->x>1}

看起來不明覺厲。其實我也不是很懂哈。


(2):給函數設定默認值

fun test(a:Int=6,b:String="love"){...}

(3):===和==區別
==比較真實的值,而===則比較內存地址,比如下面這樣一個例子

var a=1000 //自動推導為Int類型
var tempA:Int?=a
var tempB:Int?=a
println(a===a)
println(tempA===tempB)
println(a==a)
println(tempA==tempB)

上面這個例子,將會分別輸出true,false,true,true。因為自動裝箱之后,數字不會保留同一性,但會保留相等性。


(4):數字的隱式轉換消失,需要顯示轉換
由于Int 和Long是兩種不同的類型,所以不能進行隱式轉換,需要顯示轉換

var a=100;
var b:Long?=a //這樣是錯誤的,編譯無法通過

不僅這樣,就算將一個Int類型的值和一個Long類型的值進行值的比較也不可以

var a:Int=1000 //自動推導為Int類型
var b:Long=2000
println(a==b) //編譯會報錯

用官網的一句話就是

同一性和相等性都會悄無聲息地消失

那么怎么才能不報錯呢?那就需要顯示轉換

  var a:Int=1000 //自動推導為Int類型
  var b:Long=2000
  println(a.toLong()==b)

每個數字有以下幾種顯示轉換

toByte()
toShort()
toInt()
toLong()
toFloat()
toDouble()
toChar()

當然官網也給了我們一個計算的例子,用來表現隱式轉換并沒有完全消失不見

val a=2L+3 //Long+Int -->Long  

這里的變量a就被自動推導為Long類型

(5):創建數組

var strArray=arrayOf(1,2,4)
// 創建一個 Array<String> 初始化為 ["0", "1", "4", "9", "16"]
val asc = Array(5, { i -> (i * i).toString() })

(6):字符串
在kotlin中字符串分為轉義字符串和原生字符串。轉義字符串類似java中的字符串。原生字符串如下

   var strRaw="""abc

    bcd \n

|123
        |haha
"""
println(strRaw)

輸出如下:

abc

    bcd \n

|123
        |haha

我們通過上面的輸出可以看出來在原生字符串中,空格,換行,轉義字符,都會原生保留下來。而至于轉義字符串和java非常相似,相信大家都比較熟悉了。

二:離開了findViewById的Kotlin怎生書寫?

前兩天看一個Android-Kotlin開源項目PoiShuhui,項目是一個大二學生寫的,頓時有一種被拍在岸上的感覺??磥砘畹嚼蠈W到老非虛言也,現在的學生追技術,手速比我這老司機還塊啊。打開項目一看,頓時傻眼了。這個FloatingActionButton沒有findViewById啊,也沒有什么注解,到底是為什么可以直接使用呢?

還好有官方文檔,在Android擴展這一小節中,提到只要在build.gradle添加一個插件,就可以讓我們擺脫掉findViewById的困擾。

image.png

不知道是不是我理解失誤,明明說的是在項目的build.gradle中添加,我添加了然后沒用,最后還是移到了app中的build.gradle中,插件才起作用。

apply plugin: 'kotlin-android-extensions'

activity:

import kotlinx.android.synthetic.main.activity_about.*

class AboutActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_about)
        webview.setWebViewClient(WebViewClient())
        webview.loadUrl("http://www.kangaiweishi.com")
    }
}

這樣我們布局在layout中的webview的id就可以直接使用了。下面將Kotlin的傳統寫法也列出來

class AboutActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_about)
        var web=findViewById(R.id.webview) as WebView
        web.setWebViewClient(WebViewClient());
        web.loadUrl("http://www.kangaiweishi.com")
//        webview.setWebViewClient(WebViewClient())
//        webview.loadUrl("http://www.kangaiweishi.com")
    }
}

至于這個插件到底起到什么作用呢?官方文檔是這么解釋的

Kotlin Android Extensions is a plugin for the Kotlin compiler, and it does two things:
Adds a hidden caching function and a field inside each Kotlin Activity.
1:The method is pretty small so it doesn't increase the size of APK much.
2:Replaces each synthetic property call with a function call.

這個插件基本上不會增加apk的大小,所以盡管放心使用吧。

附錄
追風Kotlin系列第一滴血--Kotlin不思議,突然的想念你

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容