我将Java项目转换为Kotlin,我很惊讶接口使得Kotlin中的代码比Java中的代码更重。
示例: 我想在MyFragment的MainActivity中设置onBackPressListener。
文件1:MainActivity,文件2:MyFragment,文件3:OnBackPressedListener(接口)
Java中的文件1,Kotlin中的文件2,Java中的文件3:
activity.setOnBackPressed { /* Do something */ }
Kotlin中的文件1,Kotlin中的文件2,Java中的文件3:
activity.setOnBackPressed(OnBackPressedListener { /* Do something */ })
Kotlin中的文件1,Kotlin中的文件2,Kotlin中的文件3:
activity.setOnBackPressed(object: OnBackPressedListener {
override fun onBackPressed() {
/* Do something */
}
})
是否可以在Kotlin中使用3个文件并使用lambda来设置监听器? (在Kotlin中获取更多代码真令人沮丧......)
由于
答案 0 :(得分:5)
使用Kotlin =)时使用Java风格
如果您真的想使用OnBackPressedListener
,可以将其包装在inline
函数中,例如:
inline fun backPress(crossinline action:()->Unit):OnBackPressedListener {
return object: OnBackPressedListener {
override fun onBackPressed() {
action()
}
}
}
然后只设置监听器
activity.setOnBackPressed(backPress {
/* Do something */
})
答案 1 :(得分:5)
lambda版本仅在kotlin与java互操作时才有效,因为SAM Conversions
,请参阅the official documents。
另请注意,此功能仅适用于Java互操作;自从Kotlin 具有适当的功能类型,功能自动转换为 因此,Kotlin接口的实现是不必要的 不支持的。
因此,如果您想使用lambda来设置具有纯kotlin的侦听器,您可以像这样定义listener
和setOnBackPressed
方法:
var listener: (() -> Unit)? = null
fun setOnBackPressed(l: () -> Unit) {
listener = l
}
然后通过以下方式调用它:
listener?.invoke()