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,未嘗不是一種提高效率,就樓主自己使用來說,感覺開發速度提高了很多,並且簡潔很多了