Kotlin 如何使用带有 lambda 的自定义单击侦听器而不是声明对象:CustomClass

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

Pri*_*ola 5

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