Kotlin界面上的lambda表达式
我正在将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中获取更多代码真令人沮丧..)
谢谢
lambda版本仅在kotlin与java互操作时起作用,因为SAM Conversions
,请参阅官方文档 。
另请注意,此function仅适用于Java互操作; 由于Kotlin具有适当的函数类型,因此不需要将函数自动转换为Kotlin接口的实现,因此不受支持。
因此,如果你想使用lambda来设置纯kotlin的监听器,你可以像这样定义你的listener
和setOnBackPressed
方法:
var listener: (() -> Unit)? = null fun setOnBackPressed(l: () -> Unit) { listener = l }
然后通过以下方式调用它:
listener?.invoke()
使用Kotlin =时使用Java风格
如果你真的想使用OnBackPressedListener
你可以将它包装OnBackPressedListener
inline
函数中,如:
inline fun backPress(crossinline action:()->Unit):OnBackPressedListener { return object: OnBackPressedListener { override fun onBackPressed() { action() } } }
然后只需设置监听器
activity.setOnBackPressed(backPress { /* Do something */ })
- 检索项目的父项时出错:找不到与给定名称“Theme.AppCompat.Light”匹配的资源。 我的R.java失踪了
- Android OpenGLES 2从触摸坐标中拾取光线,取消计算略微偏离计算
- 如何在Android中的spannable字符串之间腾出空间?
- Android 2.3.4上的“未安装应用程序”错误
- 根据maven android构建配置文件更新应用程序名称和徽标
- 将HTTP 407错误作为IOException
- 我的Android应用程序中由Theme.AppCompat引起的IllegalStateException
- 如何使用textview或任何布局制作横幅或function区
- 如何在android中提取这个字符串变量?