Java思路实现
- 创建接口,创建对应抽象方法
- 声明接口成员变量
- 创建一个公共的监听方法
interface OnDialogClickListener{
fun onClickOK()
}
private var onDialogClickListener: OnDialogClickListener?=null
fun setOnDialogClickLister(onDialogClickListener:OnDialogClickListener){
this.onDialogClickListener = onDialogClickListener
}
4.在对应的地方调用接口方法
R.id.btn_ok ->{
onDialogClickListener?.onClickOK()
}
5.使用
val phoneCodePopView = PhoneCodePopView(this)
phoneCodePopView.setOnDialogClickLister(object :PhoneCodePopView.OnDialogClickListener{
override fun onClickOK() {
}
})
总的来说实现思路不是很难,按照java的方式一下就可以写出来,但是发现使用的时候不能使用lambda表达式,从而代码不够简洁,会有大量的匿名内部类
Kotlin高阶函数实现
高阶函数指的是函数中存在函数为参数或返回体的函数,这里相比Java就有点难理解了,不过,记住概念,会使用不会很难
1.声明成员变量,类型为函数类型
2.创建一个公共的监听方法
//声明变量,类型为一个函数
private var onClickOkListener: (() -> Unit)?=null
//添加一个监听方法,参数同样是一个函数,类型与onClickOkListener保持一致
fun setOnClickListener(listener: (() -> Unit)?){
this.onClickOkListener = listener
}
- () -> Unit作为一个函数声明,无参,Unit表示无返回值
- (() -> Unit)?=null 表示此声明的变量可为null
- 如果想声明带参数,有返回体的函数可以这么声明
(age:Int,name:String) -> String,注意形参可省略,那可以直接写成(Int,String) -> String
3.在对应的地方调用
R.id.btn_ok ->{
onClickOkListener?.invoke()
}
直接用声明的函数变量调用invoke()方法,这里的还可以写成onClickOkListener!!(),因为onClickOkListener本身就是一个函数,但这样假如onClickOkListener为null就会异常,所以最好直接onClickOkListener?.invoke(),如果为null就不会执行invoke方法。另外有参数,直接在invoke()方法传入参数
5.使用
val phoneCodePopView = PhoneCodePopView(this)
phoneCodePopView.setOnClickListener {
}
多个回调方法
private var onClickOkListener:((code:String)->Unit)?= null
private var onClickCancelListener:(()->Unit)?= null
private var onResetCodeListener:(()->Unit)?= null
fun setOnDialogClickListener(onClickOk:((code:String)->Unit)?,
onClickCancel:(()->Unit)?=null,
onResetCode:(()->Unit)?=null
): SmsDialog? {
this.onClickOkListener = onClickOk
this.onClickCancelListener = onClickCancel
this.onResetCodeListener = onResetCode
return this
}
大致原理是一样的,你也可以把这拆分为三个监听方法,在一个里面也行
使用
smsDialog = SmsDialog(this)
smsDialog!!.setOnDialogClickListener(onClickOk = {code->
//code 去获取验证码
mViewModel.doGetMsgCode(code)
})
注意这里可以指定监听回调具体的某一个函数,通过对应的函数名 ={}就可以了
本文介绍如何使用Kotlin实现监听器,包括接口方式和高阶函数方式,并对比Java实现,展示更简洁高效的代码风格。
1178

被折叠的 条评论
为什么被折叠?



