预期的类型布尔值:弹出式菜单的值

我正在尝试做一个弹出菜单,并根据哪个项目被点击发生的事情。 菜单项的点击监听器需要一个返回类型为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 } }** }) } }) 

你现在正在对象表达式和SAM构造函数之间的某处。 这里有一些修复它的选项。

您可以使用完整的对象表达式语法,如下所示:

 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转换来定义您必须在lambda中实现的单个函数:

 popup.setOnMenuItemClickListener { item -> when (item.itemId) { R.id.techItem -> { true } R.id.clothItem -> { true } else -> false } }