首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Kotlin自定义OnClickListener接口

Kotlin自定义OnClickListener接口
EN

Stack Overflow用户
提问于 2021-03-09 06:35:49
回答 2查看 1.6K关注 0票数 1

在学习Kotlin时,我在这个Udacity项目中遇到了这个定制的这个Udacity项目接口。我明白它在做什么,但我不明白它是如何做到的。谁能给我解释一下密码吗?

代码语言:javascript
复制
/**
 * Custom listener that handles clicks on [RecyclerView] items.  Passes the [MarsProperty]
 * associated with the current item to the [onClick] function.
 * @param clickListener lambda that will be called with the current [MarsProperty]
 */
class OnClickListener(val clickListener: (marsProperty:MarsProperty) -> Unit) {
    fun onClick(marsProperty:MarsProperty) = clickListener(marsProperty)
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-03-09 15:13:11

这很可能是Kotlin 1.4之前的一次黑客攻击,允许使用lambda构造伪接口。在Kotlin1.4之前,您只能在山姆转换接口中使用Java。在Kotlin中,如果定义了接口,则只能通过完全实现来创建接口实例,例如:

代码语言:javascript
复制
interface OnClickListener {
    fun onClick(marsProperty: MarsProperty)
}

val myImplementation = object: OnClickListener {
    fun onClick(marsProperty: MarsProperty) {
        // do something with marsProperty
    }
}

但是,如果这是在Java中定义的接口,则允许您这样做:

代码语言:javascript
复制
val myImplementation = OnClickListener { marsProperty ->
    // do something with marsProperty
}

通过在该类的构造函数中创建函数属性,它使构造函数能够与后跟lambda语法一起使用,就像第二个代码块一样。缺点是它不再是一个接口,因此它的使用方式的灵活性较低。在将接口传递给像setOnClickListener()这样的函数时,仍然不能使用跟踪lambda语法,因此它看起来类似于其中的一个,这取决于您选择如何定义setter (作为函数或属性):

代码语言:javascript
复制
someView.setOnClickListener(OnClickListener { marsProperty ->
    // do something with marsProperty
})

// or

someView.onClickListener = OnClickListener { marsProperty ->
    // do something with marsProperty
}

而且您不能让一些多用途类实现接口,因为没有接口。例如,有些人使用让Android活动实现单击监听器接口的模式,并将活动实例本身作为侦听器传递给各种视图。

在Kotlin1.4中,您现在可以通过使用fun来将接口定义为功能性。然后,SAM转换将与它们一起工作,就像在Java中定义的接口一样。

代码语言:javascript
复制
fun interface OnClickListener {
    funonClick(marsProperty: MarsProperty)
}

val myImplementation = OnClickListener { marsProperty ->
    // do something with marsProperty
}

// or

someView.setOnClickListener { marsProperty ->
    // do something with marsProperty
}
票数 5
EN

Stack Overflow用户

发布于 2021-03-09 07:22:53

它可以写成这样:

代码语言:javascript
复制
class OnClickListener {
    val clickListener: (marsProperty: MarsProperty) -> Unit//function type variable which accepts parameter of MarsProperty type

    constructor(_clickListener: (marsProperty: MarsProperty) -> Unit) {//constructor of class
        clickListener = _clickListener
    }

    fun onClick(marsProperty: MarsProperty) {
        clickListener(marsProperty)//calling of clickListener with parameter of marsProperty
    }
}

clickListener是一个函数类型变量,它接受MarsProperty类型的参数,不返回任何结果。

(marsProperty: MarsProperty) = clickListener(marsProperty)是一个单一的表达式函数。

OnClickListener(val clickListener: (marsProperty:MarsProperty) -> Unit)正在声明主构造函数。

您可以阅读关于函数类型这里、关于单个表达式函数这里、关于构造函数这里类型的文章。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66541938

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档