Android Studio弯弯曲曲地说我应该/可以将其转换为lambda。我只是回到我的Android。
popup.setOnMenuItemClickListener(object : PopupMenu.OnMenuItemClickListener {
override fun onMenuItemClick(item: MenuItem): Boolean {
if (item.itemId === R.id.action_vitals) {
val vitalsIntent = Intent(this@DashboardActivity, VitalsActivity::class.java)
vitalsIntent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP)
startActivity(vitalsIntent)
}
if (item.itemId === R.id.action_devices) {
val devicesIntent = Intent(this@DashboardActivity, DevicesActivity::class.java)
devicesIntent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP)
startActivity(devicesIntent)
}
return false
}
})
这是弯曲的“对象:PopupMenu.OnMenuItemClickListener”
答案 0 :(得分:2)
有一些评论和答案建议在IntelliJ / Android Studio中使用alt + enter,这将为您处理将代码转换为Lambda的问题。但是,可能值得介绍它为什么向您建议。
lambda是未声明的函数,例如fun someFunction()
,但立即将其作为参数传递给另一个函数。然后,该lambda将由应用程序中其他位置的其他一些代码执行。 Lambda本质上是一种简写函数,例如:
val lambda: () -> Unit = {
// Some code could go inside this Lambda here
}
对于您来说,一个重要的概念是SAM(单一抽象方法)类型。这仅是指定义需要实现的单个抽象功能的接口。在您的示例中,PopupMenu.OnMenuItemClickListener
是一个具有单个抽象方法void onMenuItemClick(MenuItem item)
的Java接口。 SAM类型可以用简写形式编写,而lambda的主体将成为抽象函数的主体。
您已正确将此代码编写为匿名对象,这很好;但可以使用Android Studio建议的lambda来更简洁地编写。在Kotlin中,另一个有用的提示是,如果某个函数或lambda是参数列表中的唯一或最终参数,则可以将其移出该函数的括号之外,或者将其完全删除。
因此您的代码将被转换为如下形式:
enterpopup.setOnMenuItemClickListener {
if (item.itemId === R.id.action_vitals) {
val vitalsIntent = Intent(this@DashboardActivity, VitalsActivity::class.java)
vitalsIntent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP)
startActivity(vitalsIntent)
}
if (item.itemId === R.id.action_devices) {
val devicesIntent = Intent(this@DashboardActivity, DevicesActivity::class.java)
devicesIntent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP)
startActivity(devicesIntent)
}
return false
}
答案 1 :(得分:1)
您可以使用 Alt + Enter 显示“建议”列表(在JetBrains语言中称为检查)。选择建议将自动为您执行转换。
IntelliJ 2019.2对该功能进行了改进(应该很快会出现在Android Studio中),显示有关最佳建议的更多信息并添加 Alt + Shift + < kbd>输入作为直接应用它的快捷方式(绕过列表) https://www.jetbrains.com/idea/whatsnew/#v2019-2