我很难理解用于调用AlertDialog.Builder的语法。 此链接显示了这段代码: https://android--code.blogspot.com/2018/02/android-kotlin-alertdialog-example.html
当他打电话时builder.setPositiveButton()
,他使用了以下代码:
builder.setPositiveButton("YES") { dialog, which ->
Toast.makeText(applicationContext, "Ok, we change the app background.", Toast.LENGTH_SHORT).show()
root_layout.setBackgroundColor(Color.RED)
}
我的问题是:
1:dialog, which ->
是什么意思?
2:当我调用一个方法时,传递一个{ something }
是什么意思?它会与自己的函数一起执行吗?
谢谢。
该代码利用了 Kotlin 的 SAM 转换功能,这只是使用只有一个方法的接口的更简洁的语法(查看本文以获得很好的解释(。在这种情况下,单击对话框的正按钮时,将执行以下代码:
Toast.makeText(applicationContext,"Ok, we change the app background.",Toast.LENGTH_SHORT).show()
root_layout.setBackgroundColor(Color.RED)
dialog
和which
是DialogInterface.OnClickListener的两个参数。如果需要,可以在执行的块中引用它们。
完整地写出来,它看起来像这样:
builder.setPositiveButton("YES", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(applicationContext,"Ok, we change the app background.",Toast.LENGTH_SHORT).show()
root_layout.setBackgroundColor(Color.RED)
}
});
setPositiveButton
采用两个参数,第一个是按钮文本,第二个是接口DialogInterface.OnClickListener
的实现。
但是当我们看到代码builder.setPositiveButton("YES")
时,方法只接受一个参数。
那么应该属于DialogInterface.OnClickListener
类型的第二个参数在哪里?
那么builder.setPositiveButton("YES")
后面的大括号中的代码块是第二个参数。因为该参数是 SAM 接口,因此您可以为其编写 lambda,因此 kotlin 允许您将其移出函数调用。
与 Kotlin 在行动
在 Kotlin 中,语法约定允许您移动 lambda 表达式 如果它是函数调用中的最后一个参数,则不带括号。在 在这个例子中,lambda 是唯一的参数,所以可以放置 括号后:
people.maxBy() { p: Person -> p.age }
当 lambda 是函数的唯一参数,您也可以删除 调用中的空括号:
people.maxBy { p: Person -> p.age }