越来越多的Android开发者开始使用kotlin了,最近项目中也需要用到,于是就对kotlin中一些有趣的用法进行了记录。
Kotlin的扩展包括了扩展函数和扩展属性。 扩展能够向已经存在的类中添加新的函数或属性,也包含第三方库或者SDK中的类。
那我们一般在什么场景下需要用到扩展函数呢,最常见的就是我们平时实现的各种Util工具类。通过扩展函数,我们可以直接在对应的类上 进行扩展。举个实际的例子,我们对Context类进行扩展。
fun Context.toast(message: CharSequence, duration: Int = Toast.LENGTH_SHORT) {
Toast.makeText(this, message, duration).show()
}
这样,我们就可以在持有Context的地方直接调用toast了,例如Activity中。
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
toast("test")
}
}
p.s 我们的扩展函数定义在什么地方呢?直接创建一个文件,然后写fun就可以了,注意是文件,不是类。外面不需要再包一层。
其实,扩展函数实质上并没有改变原来的类,它只是创建了一个静态方法。 所以,我们在Java中如何调用kotlin的扩展函数呢?以上面的扩展函数为例,在java中这样调用(ExtenalFunctionKt是扩展函数所在的文件名):
ExtenalFunctionKt.toast(context,"test");
与扩展函数类似,kotlin也可以扩展属性。
我们看一个例子,用扩展属性来设置View的padLeft属性:
var View.padLeft: Int
get() {
return paddingLeft
}
set(value) {
setPadding(value, paddingTop, paddingRight, paddingBottom)
}
以上是基于已有的属性进行一些封装,如果我们想添加新的属性呢?因为扩展属性实际上不会向类添加新的成员,所以我们无法直接创建一个新成员, 但我们可以通过其它方法来实现这样的效果,例如借助SharePreference,(例子中setSpString,getSpString是对Context建立的扩展函数,用来往SP存取数据):
var Context.member: String
get() {
return getSpString("member")
}
set(value) {
setSpString("member",value)
}
拜拜