内联onFocusChange Kotlin

Aer*_*rim 4 android inline kotlin

我试图建立一个内联函数 setOnFocusChangeListener

这是我到目前为止所得到的:

inline fun EditText.onFocusChange(crossinline hasFocus: (Boolean) -> Unit) {
    setOnFocusChangeListener(View.OnFocusChangeListener { view, b -> })
}
Run Code Online (Sandbox Code Playgroud)

我这样使用

freightTimeOfDay.onFocusChange { doSomething() }
Run Code Online (Sandbox Code Playgroud)

不幸的是,尽管它没有给我带来任何错误,doSomething()却从未被调用。

我在这里寻找两件事:

1-在其中获取一个参数,以便将其传递给doSomething()。例如

freightTimeOfDay.onFocusChange { doSomething(hasFocus) }
Run Code Online (Sandbox Code Playgroud)

2-使它工作:p,因为现在什么也没有发生。

更新:

好像Kotlin已经为此提供了某种内联类型

editText.setOnFocusChangeListener { view, b -> doSomething(b) }
Run Code Online (Sandbox Code Playgroud)

但是,这对我也不起作用,doSomething(hasFocus: Boolean)从未调用过。

提前致谢!

xin*_*aiz 6

您只是忘了打电话hasFocus

setOnFocusChangeListener(View.OnFocusChangeListener { view, b -> hasFocus(b) })
                                                                 /\/\/\/\/\
Run Code Online (Sandbox Code Playgroud)

  • @R_G 这是一个布尔参数,指示视图是获得焦点(true)还是失去焦点(false) (2认同)

Kaa*_*edi 6

这是一个甜蜜且可读的语法:

yourEditText.setOnFocusChangeListener { _, hasFocus ->
    if (hasFocus)
        showSomething()
    else
        hideSomething()
}
Run Code Online (Sandbox Code Playgroud)


Aer*_*rim 5

需要澄清的是,创建内联方法扩展并没有实际意义。这是我最初的目标,但后来我意识到使用:

editText.setOnFocusChangeListener { view, b -> doSomething(b) }
Run Code Online (Sandbox Code Playgroud)

有可能,它是内联的,很漂亮,不需要额外的工作