警报对话框构建器中使用的语法



我很难理解用于调用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)

dialogwhich是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 }

最新更新