预期类型为Boolean的值:弹出菜单

时间:2017-10-30 16:25:50

标签: android kotlin

我正在尝试创建一个弹出菜单,并根据点击的项目进行操作。菜单项的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
                     }
                 }**
             })
        }
    })

1 个答案:

答案 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
    }
}