Не получается вывести контекстное меню при удержании TextView. TextView появляется когда Я или бот отвечает мне.
Весь код представлен ниже.
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/op1"
android:title="Копировать"
>
</item>
<item
android:id="@+id/op2"
android:title="Удалить"
>
</item>
</menu>
override fun onCreateContextMenu(menu: ContextMenu, v: View, menuInfo: ContextMenu.ContextMenuInfo?) {
super.onCreateContextMenu(menu, v, menuInfo)
activity?.menuInflater?.inflate(R.menu.nav_content_menu, menu)
}
override fun onContextItemSelected(item: MenuItem): Boolean {
return when (item.itemId) {
R.id.op1 -> {
val clipboard = textuser.context.getSystemService(CLIPBOARD_SERVICE) as ClipboardManager?
val clip = ClipData.newPlainText("Order Number", textuser.text.toString())
clipboard?.setPrimaryClip(clip)
true
}
R.id.op1 -> {
textuser.text = ""
true
}
else -> super.onContextItemSelected(item)
}
}
ломается в этих строчках
textuser = view.findViewById(R.id.idTVUser) registerForContextMenu(textuser)
ОБНОВЛЕНО
В общем, я глянул на ютубе, принципе всё сделал как там. Но есть 2 момента.
у меня
super.onCreateContextMenu(menu, v, menuInfo)
activity?.menuInflater?.inflate(R.menu.nav_content_menu, menu)
}
в видео было вот так
override fun onCreateContextMenu(
menu: ContextMenu?,
v: View?,
menuInfo: ContextMenu.ContextMenuInfo?
super.onCreateContextMenu(menu, v, menuInfo)
menu !!. setHeaderTitle("Select Below Item")
menu.add(0,v !!. id,0,"Sub Item 1")
menu.add(0,v !!. id,0,"Sub Item 2")
menu.add(0,v !!. id,0,"Sub Item 3")
и остался один момент. Это видимо чтобы он понимал по каким нужно тыкнуть, потому что у меня же чат, и новые должны тоже появляться.
messageRV = view.findViewById(R.id.idRVMessage)
messageRV.adapter = messageRVAdapter
registerForContextMenu(messageRV)
Код onViewCreated
lateinit var queryEdt: TextInputEditText
lateinit var queryEdtBut: Button
lateinit var messageRV: RecyclerView
lateinit var messageRVAdapter: MessageRVAdapter
lateinit var messageList: ArrayList<MessageRVModal>
@SuppressLint("ClickableViewAccessibility")
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
val recyclerView: RecyclerView = view.findViewById(R.id.idRVMessage)
val btnScrollDown: ImageButton = view.findViewById(R.id.btnScrollDown)
queryEdt = view.findViewById(R.id.idEdtQuery)
queryEdtBut = view.findViewById(R.id.button2)
messageRV = view.findViewById(R.id.idRVMessage)
messageList = ArrayList()
messageRVAdapter = MessageRVAdapter(messageList)
messageRV.adapter = messageRVAdapter
registerForContextMenu(messageRV)
val layouManager = LinearLayoutManager(view.context)
messageRV.layoutManager = layouManager
queryEdtBut.setOnClickListener {
if (queryEdt.text.toString().isNotEmpty()) {
messageList.add(MessageRVModal(queryEdt.text.toString(), "user"))
messageRVAdapter.notifyDataSetChanged()
val adapter = messageRV.adapter
if (adapter != null) {
val lastPosition = adapter.itemCount - 1
if (lastPosition >= 0) {
messageRV.scrollToPosition(lastPosition)
}
}
} else {
Toast.makeText(activity, "Please enter your query..", Toast.LENGTH_SHORT).show()
}
}
recyclerView.addOnScrollListener(object : RecyclerView.OnScrollListener() {
override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {
super.onScrolled(recyclerView, dx, dy)
if (dy < 0) { // Пользователь прокручивает вверх
btnScrollDown.visibility = View.VISIBLE
} else if (dy > 0) { // Пользователь прокручивает вниз
btnScrollDown.visibility = View.GONE
}
}
})
btnScrollDown.setOnClickListener {
recyclerView.scrollToPosition(messageRVAdapter.itemCount - 1) // Прокрутка к последнему элементу
it.visibility = View.GONE // Скрываем кнопку после прокрутки
}
queryEdt.setOnEditorActionListener(TextView.OnEditorActionListener{ textView, i, keyEvent->
if(i== EditorInfo.IME_ACTION_SEND){
if(queryEdt.text.toString().length >0){
messageList.add(MessageRVModal(queryEdt.text.toString(),"user"))
messageRVAdapter.notifyDataSetChanged()
val f=queryEdt.text.toString()
val adapter = messageRV.adapter
if (adapter != null) {
val lastPosition = adapter.itemCount - 1
if (lastPosition >= 0) {
messageRV.scrollToPosition(lastPosition)
}
}
} else{
Toast.makeText(activity,"Please enter your query..", Toast.LENGTH_SHORT).show()
}
return@OnEditorActionListener true
}
false
})
}
Обновлено onBindViewHolder в Адаптере
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
val seder = messageList.get(position).sender
var selectedItemPosition: Int = -1
val message = messageList[position]
holder.itemView.setOnLongClickListener { view ->
selectedItemPosition = holder.adapterPosition
view.showContextMenu()
true
}
when(seder){
"user" -> (holder as UserMessageViewHolder).userMsgTV.setText(messageList.get(position).message)
"bot" -> (holder as BotMessageViewHolder).botMsgTV.setText(messageList.get(position).message)
"wr" -> (holder as WrMessageViewHolder).WrMsgTV.setText(messageList.get(position).message)
}
}
messageRV? Если этоRecyclerView, то регистрировать его бесполезно - он не реализует контекстное меню. Нужно вешать меню на элементы списка при их создании в адаптере. – woesss Dec 20 '23 at 20:45registerForContextMenu(messageRV)
это messageRV
– Navsikaya Dec 20 '23 at 21:02RecyclerViewне реализует контекстное меню. Нужно или прикручивать его в адаптере на каждый элемент или кастомизироватьRecyclerView. Варианты можете посмотреть тут https://stackoverflow.com/questions/26466877/how-to-create-context-menu-for-recyclerview – woesss Dec 21 '23 at 07:33lateinit var textuser: TextViewто что она выдает ошибку "lateinit property textuser has not been initialized" Не могу понять в какой момент мне нужно ещё инициализировать – Navsikaya Dec 21 '23 at 08:33textuser, которой в текстах вопроса вообще не наблюдается - откуда мы должны знать что вы там с ней делаете. Прочтите на досуге справку [ask] – woesss Dec 21 '23 at 09:04какую ещё предоставить информацию или мне создать новый вопрос. Подскажите пожалуйста. Почти всё сделали )))
– Navsikaya Dec 21 '23 at 09:13