一:传统java 中自定义回调事件的写法
创建 interface类,创建 interface 对象,实现 set 方法:
public Listener listener;
public void setListener(Listener listener) {
this.listener = listener;
}
public interface Listener {
void onSure(String carNo);
}
在对应的方法中进行设置:
if (listener != null) {
listener.onSure(mInputEdit.getText().toString());
}
实现设置回调:
mCarInputDialog.setListener(new CarInputDialog.Listener() {
@Override
public void onSure(String carNo) {
mCarInputDialog.dismiss();
}
});
这种类型的写法,是不能用lambda表达来缩写否则会提示:
二:才有Kotlin来实现传统的写法
private var listener: Listener? = null
fun setKeyListener(listener: Listener) {
this.listener = listener
}
interface Listener {
fun onSure(carNo: String)
}
listener?.onSure(mInputEdit.text.toString())
实现设置回调:
mCarInputDialog?.setKeyListener(object : CarInputDialog.Listener {
override fun onSure(carNo: String) {
mCarInputDialog?.dismiss()
}
})
三:采用闭包的方式
//设置对象
var listener:((carNo1: String)->Unit)?=null
//调用方法
listener?.invoke(mInputEdit.text.toString())
//接口回调
mCarInputDialog?.listener={
//实现回调处理
}
因为是单个入参,可以对其进行省略,多个入参效果如下:
mCarInputDialog?.listener={s: String, s1: String ->
}
四:将闭包作为入参的效果
var listener:((carNo1: String,carNo2: String)->Unit)?=null
//将闭包作为入参,传给listener
fun setKeyListener(listener: (carNo1: String,carNo2: String)->Unit) {
this.listener = listener
}
listener?.invoke(mInputEdit.text.toString(),"")
//和我们调用系统的onclickLister的效果一样的,lambda表达是一样的使用
mCarInputDialog?.setKeyListener{ s: String, s1: String ->
}