解释这个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
。
- IllegalArgumentException:savedInstanceState指定为非空为空
- 当我按ListView项时,请保持突出显示
- 检查RecyclerView是否滚动(findFirstCompletelyVisibleItemPosition不起作用)
- 只有类允许在类文字的左侧
- Android上的Kotlin:将光标映射到列表
- 在显示片段时,防止点击活动中的按钮
- 如何在unit testing中处理嘲讽的RxJava2可观察抛出exception
- 我可以有两个XML布局使用相同的视图使用Kotlin综合扩展?
- 试图在Kotlin中创建一个简单的recyclerView,但是适配器没有正确应用