【问题标题】:Modifying an anonymous function to invoke another anonymous function in Kotlin修改匿名函数以调用 Kotlin 中的另一个匿名函数
【发布时间】:2018-11-14 12:44:23
【问题描述】:

我的代码中的点击监听器很少,如下所示:

tvLogin.setOnClickListener {
    hideKeyBoard(it)
    login()
}

tvForgotPassword.setOnClickListener {
    hideKeyBoard(it)
    navigateToForgetPassword()
}

我想修改传递的代码块以始终调用hideKeyBoard(view),然后调用我的函数。

有没有办法创建一个可以修改代码块并调用传递函数的高阶函数?

我尝试过类似以下的方法:

val clickListener: (View,()->Unit) -> Unit 

但不确定它会如何工作。

谁能帮忙实现一下?

【问题讨论】:

  • 你能编辑setOnClickListener吗?
  • @Sweeper 不,它是 Android 框架的一部分

标签: java android functional-programming kotlin higher-order-functions


【解决方案1】:

我不确定我是否完全理解你的意思,但可能是这样的:

fun addCallTo(lambda: (View) -> Unit): (View) -> Unit {
  return { 
    hideKeyboard(it)
    lambda(it)
  }
}

// usage:
tvLogin.setOnClickListener(addCallTo { view -> login() })

【讨论】:

  • 这个函数为什么会返回?
  • @agile1 添加了使用示例。
  • @agile1 该函数将返回另一个函数。返回的函数会调用hideKeyboard和传入的参数。所以你可以将addCallTo的返回值传递给setOnClickListener。哪一部分让你感到困惑?
  • 我很困惑你为什么要返回这个函数。我们不能只返回单位吗?
  • 或者扩展功能
【解决方案2】:

您可以扩展 View.OnClickListener 并将 lambda 传递给它:

inner class HideKeyboardClickListener(private val lambda: () -> Unit) : View.OnClickListener {
    override fun onClick(v: View) {
        hideKeyboard(v)
        lambda()
    }
}

然后这样设置:

tvForgotPassword.setOnClickListener(HideKeyboardClickListener {
    navigateToForgetPassword()
})

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-11
    • 1970-01-01
    • 2022-11-10
    • 2018-01-27
    • 1970-01-01
    • 2013-02-23
    相关资源
    最近更新 更多