Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Kotlin 如何参考;这";在匿名侦听器中使用短符号时?_Kotlin - Fatal编程技术网

Kotlin 如何参考;这";在匿名侦听器中使用短符号时?

Kotlin 如何参考;这";在匿名侦听器中使用短符号时?,kotlin,Kotlin,在Kotlin中,当对匿名类使用这个简短的表示法时,有没有方法引用侦听器实例?在这种情况下,此指外部上下文(例如,活动实例),其中定义了视图: view.setOnClickListener { val self: View.OnClickListener = this // Not compiling, "this" references outer context } 使用较长的表示法时,如果您显式声明要实现的接口,并且显式重写回调方法,则可以通过this引用侦听器: view.s

在Kotlin中,当对匿名类使用这个简短的表示法时,有没有方法引用侦听器实例?在这种情况下,
指外部上下文(例如,
活动
实例),其中定义了
视图

view.setOnClickListener {
    val self: View.OnClickListener = this // Not compiling, "this" references outer context
}
使用较长的表示法时,如果您显式声明要实现的接口,并且显式重写回调方法,则可以通过
this
引用侦听器:

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

匿名类的术语短期表示法并不完全正确。它实际上是匿名函数的一个简短符号,即lambdas。当然,它们被编译成类,但从编程语言的角度来看,匿名函数没有标识,因此通过
this

引用它们的实例是没有意义的。您可以通过在“this”引用前面添加@ActivityName来解决这个问题
 val animation = object : Animation() {
        override fun applyTransformation(interpolatedTime: Float, t: Transformation) {
            val layoutParam: RelativeLayout.LayoutParams? = playerView.layoutParams as RelativeLayout.LayoutParams?
            layoutParam?.topMargin = convertDpToPixel(position, this@SurahActivity).toInt()
            playerView.layoutParams = layoutParam
        }
    }
例如,如果活动名称为MainActivity,则解决方案为:

view.setOnClickListener {
    val self: View.OnClickListener = this@MainActivity 
}

有点相关-这里是一个从侦听器本身删除侦听器的示例,该示例是在无法引用已接受的答案所报告的侦听器本身之后发生的

@Suppress(“JoinDeclarationAndAssignment”)
fun View.foo(){
//无法将其与分配组合,因为它在中被引用
//要删除自身的布局侦听器的主体
lateinit var layoutListener:ViewTreeObserver.OnGlobalLayoutListener
layoutListener=ViewTreeObserver.OnGlobalLayoutListener{
//…做点什么。。。
viewTreeObserver.removeOnGlobalLayoutListener(layoutListener)
}
viewTreeObserver.addOnGlobalLayoutListener(layoutListener)
}

我通常看不到在本地方法字段中使用的
lateinit
,因此这对我来说不是很明显

看到“短符号”,因为lambdas解释了为什么不能引用匿名类实例。不幸的是,一个人不得不使用“更长的符号”来引用那个实例。我没有用Kotlin编程,但是在你的答案中没有提到
这个
。它怎么能回答这个问题呢?此外,在发布答案时,通常不欢迎只使用一点代码。你应该解释一下这是什么。如果你能做到这一点,我将取消我的否决票,我觉得这似乎是一个真实的答案。请通过解释它的工作原理和回答问题,为你的答案提供一些背景this@SurahActivity"这是背景。非常好用。谢谢,很好用。但是这种语法的名称是什么?这实际上并不能回答我的问题。我在寻找一种方法来引用听者本身,这是不可能的,因为被接受的答案正确地解释了这一点。