使用简短表示法时如何在匿名侦听器中引用"this"?

Lar*_*erg 11 kotlin

在Kotlin中,有没有办法在匿名类中使用这个简短表示法时引用侦听器实例?在这种情况下,this引用外部上下文(例如Activity实例)view定义:

view.setOnClickListener {
    val self: View.OnClickListener = this // Not compiling, "this" references outer context
}
Run Code Online (Sandbox Code Playgroud)

当使用较长的表示法时,您明确声明要实现的接口以及显式覆盖回调方法的位置,可以通过this以下方式引用侦听器:

view.setOnClickListener(object: View.OnClickListener {
    override fun onClick(v: View) {
        val self: View.OnClickListener = this // Ok
    }
})
Run Code Online (Sandbox Code Playgroud)

jam*_*ian 10

您可以通过在“this”引用前添加@ActivityName 来解决该问题。例如,如果您的活动名称是 MainActivity,则解决方案是:

view.setOnClickListener {
    val self: View.OnClickListener = this@MainActivity 
}
Run Code Online (Sandbox Code Playgroud)

  • 这实际上并没有回答我的问题。我一直在寻找一种引用听众本身的方法,这是不可能的,因为接受的答案解释正确。 (4认同)

Kir*_*man 6

匿名类的短符号一词并不完全正确.它实际上是匿名函数的简短符号,即lambdas.当然,它们被编译为类,但从编程语言的角度来看,匿名函数没有标识,因此通过引用它们的实例没有意义this.