Kotlin學習之旅第九天
今天的主題是 - -Android Extensions
前言
Kotlin學習之旅(D6)-Kotlin Idioms part 1
Kotlin學習之旅(D7)-Kotlin Idioms part 2
Kotlin學習之旅(D8)-From Java to Kotlin
Android Extensions 是什麼
Kotlin Android Extensions 是 Kotlin 團隊開發的一個插件,目的是讓我們在開發過程中可以減少代碼的編寫量。主要的功能就是:視圖綁定
在Java中,我們經常要寫的一句代碼就是 findViewById()
,但是在一個Layou有許多View存在的情況下,重複寫這句代碼不僅工作量大,而且可讀性差,因此各路大神發揮智慧,推出了許多的第三方庫,其中最著名的就是ButterKnife
了 ,但是使用ButterKnife有個不好的地方,就是需要定義成員變量,代碼量和原生的方式差不多。
現在 Kotlin Android Extensions 能夠提供與這些開源庫功能相同的體驗,並且不需要添加任何額外代碼。
Android Extensions 怎麼用
1.在Moudle中的build.gradle文件添加插件配置
apply plugin: 'kotlin-android-extensions'
2. 在View中引入資源文件
import kotlinx.android.synthetic.main.activity_main.*
3.訪問id
import kotlinx.android.synthetic.main.activity_main.*
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// 1
btn_login.setOnClickListener {
Toast.makeText(this@MainActivity,"Android Extensions test",Toast.LENGTH_SHORT).show()
}
}
}
- 通過btn_login.setXXX 的方式來訪問view,並且調用view相關方法,不需要寫
findViewById()
import格式
import
格式是這樣的:kotlinx.android.synthetic.main.佈局名稱.*
。需要注意的是include
進來的佈局,也是需要通過import
導入相應佈局,這樣才能正常使用。
ViewHolder 使用Extensions
剛開始的時候Extensions是不支持在ViewHolder中使用視圖綁定的,因此還是需要些findViewById,但是從Kotlin 1.1.4起,Extensions加入了增強功能,由於這項功能還未正式發佈,因此需要開啓實驗標誌
####1.開啓experimental
在Module的build.gradle文件中設置:
androidExtensions {
experimental = true
}
2.編寫ViewHolder
import android.support.v7.widget.RecyclerView
import android.view.View
import kotlinx.android.extensions.LayoutContainer
import kotlinx.android.synthetic.main.activity_main.*
class ViewHolder constructor(override val containerView: View?)
: RecyclerView.ViewHolder(containerView),
LayoutContainer { // 1
fun setContent(str: String) {
helloTv.text = str // 2
}
}
- 實現LayoutContainer
- 使用helloTv.text
3. 什麼是LayoutContainer
在Activity,Fragment,View中我們知道import對應的layout就可以了,但是像ViewHolder這些特殊的,我們就需要通過實現LayoutContainer接口,接口返回一個containerView,按照字面意思理解就是內容視圖,這個containerView就包含了ViewHolder裏面的所有子View,因此可以直接使用view.setxxx / view.property 的寫法
Android多渠道版本
Android Extensions 插件支持Android 多渠道版本,假如在你的build.gradle中有一個名爲free的版本
android {
productFlavors {
free {
versionName "1.0-free"
}
}
}
然後你就可以通過如下方式導入針對free/res/layout/activity_free.xml的所有生成的屬性。
import kotlinx.android.synthetic.free.activity_free.*
內部原理
Kotlin Android Extensions 是一個Kotlin編譯器插件。它執行下面兩個操作:
- 爲每一個Kotlin Activity添加一個隱藏的緩存方法和一個域。這個方法相當之小,基本不會增加APK 的大小。
- 用方法調用替換每一個屬性調用。
例如:
class MyActivity: Activity()
fun MyActivity.a() {
this.textView.setText(“”)
}
總結
Kotlin Android Extensions 的主要功能其實就是視圖綁定,但是這一個功能也可以減少許多重複代碼的編寫,因此有機會還是把這個插件用上吧~
Day 9 - Learn Kotlin Trip, Completed.