修改匿名函数以在Kotlin中调用另一个匿名函数

时间:2018-06-05 06:09:37

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

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

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

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

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

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

我尝试了类似下面的内容:

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

但不确定它是如何起作用的。

有谁可以帮助如何实现?

2 个答案:

答案 0 :(得分:3)

我不确定我完全理解你的意思,但也许是这样的:

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

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

答案 1 :(得分: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()
})