我正在使用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向我显示的错误消息。
谢谢。
答案 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()