美文网首页
kotlin扩展函数/变量

kotlin扩展函数/变量

作者: 李庆雪 | 来源:发表于2017-06-22 16:06 被阅读0次

通过给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变量了

相关文章

网友评论

      本文标题:kotlin扩展函数/变量

      本文链接:https://www.haomeiwen.com/subject/ktsgqxtx.html