我正在尝试创建一个弹出菜单,并根据点击的项目进行操作。菜单项的on click侦听器需要返回类型为Boolean的类型。我给它一个返回类型,但它仍然显示为红色,带有"预期类型为Boolean"的值。有人能告诉我这里有什么问题吗? (我知道我没有让菜单点击做任何事情)
val menuButton = findViewById<Button>(R.id.categoryImageButton)
menuButton.setOnClickListener(View.OnClickListener {
fun onClick(view: View){
val popup = PopupMenu(this,menuButton)
popup.menuInflater.inflate(R.menu.popup_menu, popup.menu)
popup.setOnMenuItemClickListener(PopupMenu.OnMenuItemClickListener {
**fun onMenuItemClick(item: MenuItem): Boolean {
when (item.itemId) {
R.id.techItem -> {
return true
}
R.id.clothItem -> {
return true
}
else -> return false
}
}**
})
}
})
答案 0 :(得分:2)
您现在拥有的是对象表达式和SAM构造函数之间的某个位置。以下是修复它的一些选项。
您可以使用完整的object expression语法,如下所示:
popup.setOnMenuItemClickListener(object: PopupMenu.OnMenuItemClickListener {
override fun onMenuItemClick(item: MenuItem): Boolean {
when (item.itemId) {
R.id.techItem -> {
return true
}
R.id.clothItem -> {
return true
}
else -> return false
}
}
})
您可以使用when
作为表达式稍微改进上述内容,并将其返回:
popup.setOnMenuItemClickListener(object: PopupMenu.OnMenuItemClickListener {
override fun onMenuItemClick(item: MenuItem): Boolean {
return when (item.itemId) {
R.id.techItem -> {
true
}
R.id.clothItem -> {
true
}
else -> false
}
}
})
或者您可以使用SAM conversion来定义您必须在lambda中实现的单个函数:
popup.setOnMenuItemClickListener { item ->
when (item.itemId) {
R.id.techItem -> {
true
}
R.id.clothItem -> {
true
}
else -> false
}
}