kotlin学习笔记——Kotlin Android Exten
Kotlin学习笔记系列:http://blog.csdn.net/column/details/16696.html
Kotlin Android Extensions是另外一个团队开发的,它是一个插件所以不需要依赖别的库。当前仅仅包含view的绑定,会自动创建很多属性让我们直接访问xml中的view,我们就不需要明确的去布局中找这些view了。
自动创建的属性的名字来源于view的id,所以我们取id的时候要十分小心。这些属性类型也是从xml中获取的,所以不必再做类型转换。
Kotlin Android Extensions具有缓存功能,避免每次使用属性都重新获取一次。但是缓存功能目前只在activity和fragment中有效,如果在扩展函数中则跳过缓存。
使用Kotlin Android Extensions
一、首先加入插件的依赖,在module中的build.gradle中(注意不是root下的):
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'org.jetbrains.kotlin:kotlin-android-extensions:1.1.2-4'
}
}
二、import进代码中:
1、activity和fragment的Android Extensions
import kotlinx.android.synthetic.activity_main.*
以kotlinx.android.synthetic开头,activity_main是layout的名字(注意:新版本前面要加上main,既.main.activity_main.)。
当调用了setContentView之后就可以直接使用自动创建的view的属性了。
注意:如果在layout中使用include,那么必须将include的layout也import进来。
2、view的Android Extensions
有很多代码需要访问xml中的view,比如自定义view或者adapter。绑定一个view到另外一个view,这时需要import
如:
import kotlinx.android.synthetic.main.item_view.view.*
class RecyclerAdaper(var items: List<String>, var listener: (String) -> Unit) : RecyclerView.Adapter<RecyclerAdaper.ViewHolder>(){
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
holder.bind(items[position])
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
return ViewHolder(View.inflate(parent.context, R.layout.item_view, null))
}
override fun getItemCount(): Int {
return items.size
}
class ViewHolder(view: View) : RecyclerView.ViewHolder(view){
fun bind(str: String){
itemView.nametext.text = str
}
}
}
注意import进来的不是layout了,而是layout.view,这样就可以直接使用这个view的子view了。
三、直接在代码中使用
如:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.v7.widget.RecyclerView
android:id="@+id/recyclerview"
android:layout_width="match_parent"
android:layout_height="match_parent"></android.support.v7.widget.RecyclerView>
</RelativeLayout>
MainActivity.java
import kotlinx.android.synthetic.main.activity_main.*
class MainActivity : Activity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
//var recyclerview = findViewById(R.id.recyclerview) as RecyclerView
//var recyclerview: RecyclerView = find(R.id.recyclerview)
recyclerview.layoutManager = LinearLayoutManager(this)
可以看到直接使用recyclerview这个变量,不必在使用find代码,节省了大量的代码