在一篇的Kotlin for Android的环境搭建中,已经简单介绍了怎么在AS中配置Kotlin的开发环境,其实很简单的。今天我们来一起学习,Kotlin团队开发的一个插件Kotlin Android Extensions,这插件可以让我们用更少的代码来开发程序,目前仅仅包括了view的绑定,该插件自动创建了很多的属性来让我们直接访问XML中的view,省去了开发者findViewById。我们在使用Java时,findViewById是比较麻烦的,通过控件的ID来查找控件,当然也有第三方框架ButterKnife,Dagger等来减少findViewById的使用,通过插件自动生成,但在使用Kotlin时,便不必如此。
我们可以看一下通过用Kotlin扩展函数的原理和好处,该插件会代替任何属性调用函数,比如获取到view并具有缓存功能,以免每次属性被调用都会去重新获取这个view, 这个缓存装置只会在Activity或者Fragment中才有效。ButterKnife类似的库,在运行时,需要对每一个控件进行注解。Kotlin的扩展函数提供类似于这些库的相同体验,但不需要额外的代码和运行时间。减少findViewById的使用的同时,没有产生额外的代码,也不用在运行时对每个控件进行注解。
用Kotlin for Android也很简单只要在AndroidStudio项目中build.gradle中增加了这个依赖;
然后在项目中的app中的gradle中添加apply plugin: 'kotlin-android-extensions',把这个插件功能打开,编译一下就可以了。
在Activity、Fragment、Adapter中使用该插件都只需要一句话即可,import kotlinx.android.synthetic.main.<layout>.*。
下面通过一个简单的实例进行演示,我们用改插件给一个包含RecyclerView的页面,绑定数据展示结果。首先我们新建一个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) {
}}