在一篇的Kotlin for Android的環(huán)境搭建中拼卵,已經(jīng)簡單介紹了怎么在AS中配置Kotlin的開發(fā)環(huán)境烙肺,其實(shí)很簡單的膊升。今天我們來一起學(xué)習(xí)址愿,Kotlin團(tuán)隊(duì)開發(fā)的一個(gè)插件Kotlin Android Extensions,這插件可以讓我們用更少的代碼來開發(fā)程序祠墅,目前僅僅包括了view的綁定侮穿,該插件自動(dòng)創(chuàng)建了很多的屬性來讓我們直接訪問XML中的view,省去了開發(fā)者findViewById毁嗦。我們在使用Java時(shí)亲茅,findViewById是比較麻煩的,通過控件的ID來查找控件狗准,當(dāng)然也有第三方框架ButterKnife克锣,Dagger等來減少findViewById的使用,通過插件自動(dòng)生成腔长,但在使用Kotlin時(shí)袭祟,便不必如此。
我們可以看一下通過用Kotlin擴(kuò)展函數(shù)的原理和好處捞附,該插件會(huì)代替任何屬性調(diào)用函數(shù)巾乳,比如獲取到view并具有緩存功能,以免每次屬性被調(diào)用都會(huì)去重新獲取這個(gè)view鸟召, 這個(gè)緩存裝置只會(huì)在Activity或者Fragment中才有效想鹰。ButterKnife類似的庫,在運(yùn)行時(shí)药版,需要對每一個(gè)控件進(jìn)行注解辑舷。Kotlin的擴(kuò)展函數(shù)提供類似于這些庫的相同體驗(yàn),但不需要額外的代碼和運(yùn)行時(shí)間槽片。減少findViewById的使用的同時(shí)何缓,沒有產(chǎn)生額外的代碼肢础,也不用在運(yùn)行時(shí)對每個(gè)控件進(jìn)行注解。
用Kotlin for Android也很簡單只要在AndroidStudio項(xiàng)目中build.gradle中增加了這個(gè)依賴碌廓;
然后在項(xiàng)目中的app中的gradle中添加apply plugin: 'kotlin-android-extensions'传轰,把這個(gè)插件功能打開,編譯一下就可以了谷婆。
在Activity慨蛙、Fragment、Adapter中使用該插件都只需要一句話即可纪挎,import kotlinx.android.synthetic.main.<layout>.*期贫。
下面通過一個(gè)簡單的實(shí)例進(jìn)行演示,我們用改插件給一個(gè)包含RecyclerView的頁面异袄,綁定數(shù)據(jù)展示結(jié)果通砍。首先我們新建一個(gè)kotlin activity頁面代碼如下
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.support.v7.widget.LinearLayoutManager
import kotlinx.android.synthetic.main.activity_recycler.*
class RecyclerViewActivity : AppCompatActivity() {
var adapter:KotlinRecyclerViewAdapter ?= null
var list =ArrayList<String>()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_recycler)
initView()
}
fun initView() {
for (i in 0 ..20){
list.add("西紅柿的眼淚" + i)
}
recycler_view.layoutManager = LinearLayoutManager(this)
adapter = KotlinRecyclerViewAdapter(this,list)
recycler_view.adapter =adapter
}}
適配器的源碼
import kotlinx.android.synthetic.main.kotlin_itemview.view.*
class KotlinRecyclerViewAdapter(val context:Context,val list:List<String>):RecyclerView.Adapter<KotlinRecyclerViewAdapter.KotlinRecyclerHolder>(){
override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int): KotlinRecyclerHolder {
return KotlinRecyclerHolder(LayoutInflater.from(context).inflate(R.layout.kotlin_itemview,parent,false))
}
override fun onBindViewHolder(holder: KotlinRecyclerHolder, position: Int) {
val s=list.get(position)
holder.itemView.tv_recycler_item.text=s;
}
override fun getItemCount(): Int {
return list.size
}
class KotlinRecyclerHolder(itemView:View?):RecyclerView.ViewHolder(itemView) {
}}