Kotlin学习之旅第九天
今天的主题是 - -Android Extensions
Kotlin学习之旅(D1)-学习计划&基本语法
Kotlin学习之旅(D2)-基本语法
Kotlin学习之旅(D3)-类与继承
Kotlin学习之旅(D4)-函数与Lambda表达式
Kotlin学习之旅(D5)-高级语法
Kotlin学习之旅(D6)-Kotlin Idioms part 1
Kotlin学习之旅(D7)-Kotlin Idioms part 2
Kotlin学习之旅(D8)-From Java to Kotlin
Kotlin Android Extensions 是 Kotlin 团队开发的一个插件,目的是让我们在开发过程中可以减少代码的编写量。主要的功能就是:视图绑定
在Java中,我们经常要写的一句代码就是 findViewById()
,但是在一个Layou有许多View存在的情况下,重复写这句代码不仅工作量大,而且可读性差,因此各路大神发挥智慧,推出了许多的第三方库,其中最著名的就是ButterKnife
了 ,但是使用ButterKnife有个不好的地方,就是需要定义成员变量,代码量和原生的方式差不多。
现在 Kotlin Android Extensions 能够提供与这些开源库功能相同的体验,并且不需要添加任何额外代码。
apply plugin: 'kotlin-android-extensions'
import kotlinx.android.synthetic.main.activity_main.*
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()
}
}
}
findViewById()
import
格式是这样的:kotlinx.android.synthetic.main.布局名称.*
。需要注意的是include
进来的布局,也是需要通过import
导入相应布局,这样才能正常使用。
刚开始的时候Extensions是不支持在ViewHolder中使用视图绑定的,因此还是需要些findViewById,但是从Kotlin 1.1.4起,Extensions加入了增强功能,由于这项功能还未正式发布,因此需要开启实验标志
####1.开启experimental
在Module的build.gradle文件中设置:
androidExtensions {
experimental = true
}
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
}
}
在Activity,Fragment,View中我们知道import对应的layout就可以了,但是像ViewHolder这些特殊的,我们就需要通过实现LayoutContainer接口,接口返回一个containerView,按照字面意思理解就是内容视图,这个containerView就包含了ViewHolder里面的所有子View,因此可以直接使用view.setxxx / view.property 的写法
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编译器插件。它执行下面两个操作:
例如:
class MyActivity: Activity()
fun MyActivity.a() {
this.textView.setText(“”)
}
Kotlin Android Extensions 的主要功能其实就是视图绑定,但是这一个功能也可以减少许多重复代码的编写,因此有机会还是把这个插件用上吧~
Day 9 - Learn Kotlin Trip, Completed.