越来越多的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) }
拜拜