ros*_*lin 2 lambda android onclick kotlin onclicklistener
这是我的界面:
interface DialogOkClickListener {
fun onDialogOkClick()
}
Run Code Online (Sandbox Code Playgroud)
这是我的 clickListener
fun setOkClickListener(okClickListener: DialogOkClickListener): DialogOkCancel {
this.okClickListener = okClickListener
return this
}
Run Code Online (Sandbox Code Playgroud)
这是它目前的工作方式:
.setOkClickListener(object : DialogOkCancel.DialogOkClickListener{
override fun onDialogOkClick() {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}
})
Run Code Online (Sandbox Code Playgroud)
但如果我尝试这样的事情:
.setCancelClickListener{ methodToCall() }
Run Code Online (Sandbox Code Playgroud)
我得到 type missmatch found () -> String
In java, there is SAM conversion which is an automatic conversion of a lambda into an interface with a single abstract method. It is not supported for interfaces defined in Kotlin.
And therefore you have to define your implementation like this
object : DialogOkCancel.DialogOkClickListener{
override fun onDialogOkClick() {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}
}
Run Code Online (Sandbox Code Playgroud)
Check out this link https://youtrack.jetbrains.com/issue/KT-7770
It is preferable to use functional types (e.g. Click -> Unit) instead of functional interfaces if possible.
What you can do is this
interface DialogOkClickListener {
fun onDialogOkClick()
}
private val clickEvent = {}
fun DialogOkCancel.setOkClickListener(
click: () -> Unit = clickEvent
): DialogOkClickListener {
return object : DialogOkClickListener {
override fun onDialogOkClick() {
click()
}
}
}
Run Code Online (Sandbox Code Playgroud)
And use it like this:
DialogOkCancel.setOkClickListener{ /*Do anything*/ }
Run Code Online (Sandbox Code Playgroud)
Note: Here I have created
kotlin extension function
| 归档时间: |
|
| 查看次数: |
2107 次 |
| 最近记录: |