解释这个Kotlin函数结构
我正在使用这个Kotlin函数。 我知道我们有一个名为mPasswordView!!.setOnEditorActionListener
的函数,它mPasswordView!!.setOnEditorActionListener
参数TextView.OnEditorActionListener
,但那是什么? 我们在参数里面有花括号吗?
mPasswordView!!.setOnEditorActionListener(TextView.OnEditorActionListener { textView, id, keyEvent -> if (id == R.id.login || id == EditorInfo.IME_NULL) { attemptLogin() return@OnEditorActionListener true } false })
在你的例子中使用的function是一个SAM构造函数 。 setOnEditorActionListener
侦听器将OnEditorActionListener
作为其参数。 这个接口只有一个你必须实现的方法,这使得它成为一个单一的抽象方法(SAM)接口。
在Java中使用此方法的完整语法是:
mPasswordView.setOnEditorActionListener(new TextView.OnEditorActionListener() { @Override public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { attemptLogin(); return true; } });
一对一转换到Kotlin会给你:
mPasswordView.setOnEditorActionListener(object: TextView.OnEditorActionListener{ override fun onEditorAction(v: TextView?, actionId: Int, event: KeyEvent?): Boolean { attemptLogin() return true } })
但是,Kotlin允许您使用以更简洁的语法使用SAM接口作为其参数的方法,而不是传入lambda。 这被称为SAM转换:
mPasswordView.setOnEditorActionListener { v, actionId, event -> attemptLogin() true }
SAM转换会自动确定此lambda对应的接口,但是您可以使用称为SAM构造函数的方式显式指定它,这就是示例代码中的内容。 一个SAM构造函数返回一个实现给定接口的对象,并将你传递给它的lambda传递给它的单个方法的实现。
mPasswordView.setOnEditorActionListener( TextView.OnEditorActionListener { v, actionId, event -> attemptLogin() true })
在这种情况下这是多余的,因为只有一个叫做setOnEditorActionListener
方法。 但是,如果有多个具有相同名称的方法,将不同的接口作为参数,则可以使用SAM构造函数来指定要调用的方法的哪个重载。
有关SAM转换的官方文档
所以换句话说,结构是以下(我会留在这里有人需要帮助理解):
function_A ( parameters_A { override_parameters_B -> override_function_B } )
其中overriden_function_B
是对象的构造函数,称为parameters_A
。
- 一个LiveData中有多个对象
- Android设备版本的React-Native项目没有更新,即使模拟器是
- Kotlin使用Parcelable将ListArray传递给另一个Activity
- 检测覆盖中的触摸事件并进一步传递
- Android室数据库错误:未使用的参数:在@Query函数中的天数
- Kotlin / Android应用程序 – 从外部活动更改视图元素
- 使用Project Astoria转换Kotlin Android应用程序
- 像在Java中那样扩展TextInput以在React Native中自定义默认字体和文本颜色
- 我在Signal android项目中使用volleyplus和volley库