1. 程式人生 > >Kotlin+Anko 你應該嘗試的新Android開發方式

Kotlin+Anko 你應該嘗試的新Android開發方式

老早之前就聽說過Kotlin語言,奈何不成熟,也沒什麼機會用到它,只是用它寫過demo而已,最近樓主因為單獨一個人負責一個專案,因為專案難度不大,所以就打算用一下Kotlin來開發,因為Kotlin與Java是完美替換的,所以如果出問題不熟也可以馬上切換為Java,所以風險不會很大,還有在公司用新技術,最好是請示你們的老大,因為樓主是獨立開發且是外包,所以就自己做注意了,好了,不說廢話。

初嘗Kotlin+Anko,我發現Kotlin寫起來很舒服,首先在我們的專案中配置Kotlin和Anko環境,在專案的build.gradle中

buildscript {
    ext.kotlin_version = '1.0.4'
repositories { jcenter() } dependencies { classpath 'com.android.tools.build:gradle:2.2.0' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" // NOTE: Do not place your application dependencies here; they belong // in the individual module
build.gradle files } }

在模組的build.gradle中

apply plugin: 'kotlin-android'

 compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
    compile 'org.jetbrains.anko:anko-sdk15:0.9' // sdk19, sdk21, sdk23 are also available
    compile 'org.jetbrains.anko:anko-support-v4:0.9' // In case you need support-v4 bindings
compile 'org.jetbrains.anko:anko-appcompat-v7:0.9' // For appcompat-v7 bindings compile 'org.jetbrains.anko:anko-recyclerview-v7:0.9' // For appcompat-v7 bindings compile 'org.jetbrains.anko:anko-design:0.9'

就這樣我們配置好了Kotlin和Anko的環境了,接下來我們就能使用了:

變數

在java中我們宣告一個變數時,需要先宣告型別再宣告變數,而Kotlin不用,而是跟js一樣統一用var來修飾變數,用var修飾的變數值是可變的,如果你想宣告一個不可變的變數即常量,可以用val關鍵字來形容,例如:

var a = "string"
val b = "final"

注意,因為Kotlin是空安全的,如果變數有可能是null,我們需要先用?顯示宣告變數可以為null,然後在別的地方使用時要用變數+!!來引用,即

var a : Int ?= null

a!!.toString()

方法

Kotlin中方法的宣告統一用關鍵字fun來形容,例如:

fun A(a:Int){}//帶參 無返回值
fun A(){}//不帶參 無返回值
fun A(a:Int) : Int{return a}//帶參 有返回值

Kotlin中方法的返回值是相當於定義變數一樣用:型別。

data class

資料類是我覺得最簡單方便的,在java中我們定義一個數據類bean時要寫成這樣:

class A{
 private String a;
 //set方法
 //get方法
}

就是這種一大堆,而Kotlin中資料類直接這樣寫:

data class A(val x: Double, val y: Double)

是不是很方便,這種寫法是Kotlin初始化的方法一種形式,還有一種不是寫在首行而是寫在init{}塊中,Kotlin允許有多個初始化方法,但是其它都是副初始化方法,最後都會指向主初始化方法。
Kotlin還有很大新特性,具體的可以去官網檢視demo,我這裡只是大概列出一些普通的特性,
Anko是一個新的佈局框架,我們在Android開發中佈局都是寫在xml檔案中,每次都要寫一大堆佈局程式碼,而且不能複用,所以Android的佈局一般都是很麻煩會花費很多時間,並且Android本身解析xml檔案也需要時間,而Anko不會,Anko使用的是DSL,領域相關語言,開銷很小,所以可以提高我們APP的繪製效率以及效能。
下面用Anko佈局一個登陸介面,有使用者名稱框,密碼框,密碼

relativeLayout {
            editText {
                id = PHONENUMBER_ID
            }.lparams (width = matchParent,height = wrapContent){
                centerHorizontally()
            }

            editText {
                id = PASSWORD_ID
                inputType = InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_VARIATION_PASSWORD
                filters = myFilters
            }.lparams(width = matchParent,height = wrapContent) {
                below(PHONENUMBER_ID)
            }

            button(ctx.getString(R.string.btn_login)){
                id = LOGIN_ID
            }.lparams (width = wrapContent,height = wrapContent) {
                below(PASSWORD_ID)
                centerHorizontally()
            }
        }

這樣就是我們的佈局了,簡潔很多,並且複用,我們控制元件的佈局是寫在lparams中,Anko的擴充套件性也很強,就是我們自定義的控制元件也能放在Anko中使用例如:

inline fun ViewManager.myRecyclerView(theme: Int = 0) = myRecyclerView(theme) {}
inline fun ViewManager.myRecyclerView(theme: Int = 0, init: MyRecyclerView.() -> Unit) = ankoView({ MyRecyclerView(it) }, theme, init)

在這裡我們自定義了一個控制元件叫MyRecyclerView,我們新建一個.kt檔案,然後輸入上面的程式碼,我們就可以在app中使用這個控制元件了

val myRecyclerView = myRecyclerView {
                layoutManager = LinearLayoutManager(ctx, LinearLayoutManager.VERTICAL, false)

            }.lparams(width = matchParent, height = wrapContent)

            myRecyclerView.setEmptyView(textView ("我是空資料的時候顯示") {})

            myRecyclerView.setEmptyViewListener{
                v->
                Log.i("TAG","OOOOOOOO空資料")
            }

這就是Anko的擴充套件性,而且擴充套件性還很強,我們可以用兩個控制元件直接擴充套件成一個控制元件:

fun _LinearLayout.smsCode(name: String): EditText {
        var a : EditText? = null
        linearLayout {
            orientation = LinearLayout.HORIZONTAL

            textView("$name:") {
                textSize = 18f
            }.lparams(width = dip(50)
                    ,height = dip(50)) {
            }

            a = editText().lparams (width = dip(50)
                    ,height = dip(50)){
            }
        }
        return a!!

    }

這樣就是把兩個控制元件簡單的合成一個,適用於一些控制元件佈局是一樣且經常用的,這樣就可以直接當成一個控制元件來使用。
Anko和Kotlin還有更多好玩的特性,我覺得使用這種方式來開發Android,未嘗不是一種提高效率,就樓主自己使用來說,感覺開發速度提高了很多,並且簡潔很多了