Ошибка при использовании Toast.makeToast в неактивном классе с использованием kotlin - PullRequest
1 голос
/ 07 июля 2019

Я создаю приложение для чата в Android с использованием Kotlin.Я хочу долго нажимать на сообщение, чтобы скопировать его в буфер обмена.Эта функция работает нормально, но я не могу показать тост из-за какой-то ошибки.Вот мой код.

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.

enter image description here

Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 07 июля 2019

Когда вы используете setOnLongClickListener { /* your code here */ } в kotlin, это эквивалентно:

setOnLongClickListener(new OnLongClickListener() {public boolean onLongClick(View v){ /* your code here */ }}); в 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()
1 голос
/ 07 июля 2019

Вам необходимо передать контекст или получить его из представления, например itemView.context.

...