使用Kotlin在非活动类中使用Toast.makeToast时出错

时间:2019-07-07 19:58:22

标签: android android-studio kotlin android-toast

我正在使用Kotlin在android中构建一个聊天应用程序。我想长按一条消息以将其复制到剪贴板上。此功能工作正常,但由于某些错误,我无法显示吐司。这是我的代码。

class ChatFromItem(val text: String, val user: User): Item<ViewHolder>() {
override fun bind(viewHolder: ViewHolder, position: Int) {
    viewHolder.itemView.textView_from_row.text = text
    viewHolder.itemView.textView_from_row.setOnLongClickListener {
        Toast.makeText(this, "Message copied", Toast.LENGTH_LONG).show()
        val clipboard = it.context.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager
        val myClip = ClipData.newPlainText("label", text)
        clipboard.primaryClip = myClip
        true
    }

    val uri = user.profileImageUrl
    val target = viewHolder.itemView.imageView_chat_from_row
    Picasso.get().load(uri).into(target)
}

override fun getLayout(): Int {
    return R.layout.chat_from_row
}

}

有些人可能会因为在.setOnLongClickListener的最底部写上“ true”而感到困惑。没有toast语句,其余代码将无法正常工作。我已经测试了很多次。 我要包含一张图像,其中包含android studio向我显示的错误消息。

enter image description here

谢谢。

2 个答案:

答案 0 :(得分:1)

您需要传递上下文或从视图中获取上下文,例如itemView.context。

答案 1 :(得分:1)

在kotlin中使用setOnLongClickListener { /* your code here */ }时,等同于:

setOnLongClickListener(new OnLongClickListener() {public boolean onLongClick(View v){ /* your code here */ }}); in Java

因此,当您执行此操作时:

 viewHolder.itemView.textView_from_row.setOnLongClickListener {
    Toast.makeText(this, "Message copied", Toast.LENGTH_LONG).show()
    ....
 }

等效于此:

setOnLongClickListener(new OnLongClickListener() {
     @Override
     public boolean onLongClick(View v) {

          Toast.makeText(this, "Message copied", Toast.LENGTH_LONG).show()


     }
});

您可以看到上面的代码中的this不是Context类型,而是OnLongClickListener类型!

您可以使用自己拥有的视图找到上下文:

 Toast.makeText(viewHolder.itemView.context, "Message copied", Toast.LENGTH_LONG).show()