通过给TextView设置文字可以知道,我们省略了getter,setter,和findviewbyid,本节继续介绍扩展函数.
函数扩展
一般来说,我们扩展一个类,需要去继承来实现,不过这样又要写N多代码,kotlin能让你的代码量大大减少!不信?快来跟我看看!
- 我们再在布局中添加一个Button
我们实现点击Button弹出一个Toast - java代码:
Button button = findviewbyid(R.id.button)
button.setOnClickListener(new View.OnClickListener() {
@Override public void onClick(View v) {
Toast.makeText(this,"hello java",Toast.LENGTH_SHORT);
}
});
- Kotlin代码:
button.setOnClickListener {toast("hello kotlin")}
经过编写java代码可以看出,你需要些很多代码,儿Kotlin只需要一行代码就可以搞定.
简单分析
- 去掉findviewbyid
这个在之前的文章中已经说明白了这里就不在详细说明 - 加入点击事件
对于OnClickListener
接口我们可以用lambda
,Kotlin是完美支持lambda的,这点不用担心,所以就可以写成:
button.setOnClickListener {
v:View -> Toast.makeText(this,"hellolambda",Toast.LENGTH_SHORT).show()
}
如果lambda左值参数没有用到的话,是可以省略的,所以现在写成了
button.setOnClickListener {Toast.makeText(this,"hello lambda",Toast.LENGTH_SHORT).show()}
扩展函数
函数扩展可以让你对任意类进行扩展,而不用继承等等复杂的操作。
举个栗子!拿Toast来说,到处都可以用到,所以我们新建一个文件夹Extended
,在里面新建一个Extended文件
里面写上如下代码:
fun Context.toast(message: String,length: Int = Toast.LENGTH_SHORT) = Toast.makeText(this,message,length).show()
对!没错,加了这句话,就可以在所有Context类型中使用toast这个函数了。
当然相信大家都有疑惑,那万一不在Context类型里面呢,我想弹出一个Toast怎么办呢?
大家不必惊慌,kotlin里面提供了包级函数,从此告别工具类
- 首先要获取一个全局的Context,没错就是创建Application子类
class App : Application() {
override fun onCreate() {
super.onCreate()
context = this
}
companion object{
lateinit var context: Context
}
}
- 修改toast函数
fun toast(message: String, length: Int = Toast.LENGTH_SHORT) = Toast.makeText(App.context,message,length).show()
这样就可以在任意地方调用Toast了
扩展变量
- 先定义只能在Context子类能用的变量
val Context.context
get() = this
这样就可以在Context子类用扩展变量context了
- 当然想在任何地方调用的话就要定义包级变量
val context
get() = App.mContext //衔接上文中的自定义Application
这样就可以在用到Context的地方调用context变量了
网友评论