0

Не получается вывести контекстное меню при удержании TextView. TextView появляется когда Я или бот отвечает мне.

Весь код представлен ниже.

<menu xmlns:android="http://schemas.android.com/apk/res/android">
&lt;item
    android:id=&quot;@+id/op1&quot;
    android:title=&quot;Копировать&quot;
    &gt;

&lt;/item&gt;


&lt;item
    android:id=&quot;@+id/op2&quot;
    android:title=&quot;Удалить&quot;
    &gt;

&lt;/item&gt;

</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(), &quot;user&quot;))

            messageRVAdapter.notifyDataSetChanged()

            val adapter = messageRV.adapter

            if (adapter != null) {
                val lastPosition = adapter.itemCount - 1
                if (lastPosition &gt;= 0) {
                    messageRV.scrollToPosition(lastPosition)
                }
            }






        } else {

            Toast.makeText(activity, &quot;Please enter your query..&quot;, 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 &lt; 0) { // Пользователь прокручивает вверх
                btnScrollDown.visibility = View.VISIBLE
            } else if (dy &gt; 0) { // Пользователь прокручивает вниз
                btnScrollDown.visibility = View.GONE
            }
        }
    })

        btnScrollDown.setOnClickListener {
            recyclerView.scrollToPosition(messageRVAdapter.itemCount - 1) // Прокрутка к последнему элементу
            it.visibility = View.GONE // Скрываем кнопку после прокрутки
        }



    queryEdt.setOnEditorActionListener(TextView.OnEditorActionListener{ textView, i, keyEvent-&gt;
        if(i== EditorInfo.IME_ACTION_SEND){
            if(queryEdt.text.toString().length &gt;0){

                messageList.add(MessageRVModal(queryEdt.text.toString(),&quot;user&quot;))
                messageRVAdapter.notifyDataSetChanged()


                val f=queryEdt.text.toString()
                val adapter = messageRV.adapter
                if (adapter != null) {
                    val lastPosition = adapter.itemCount - 1
                    if (lastPosition &gt;= 0) {
                        messageRV.scrollToPosition(lastPosition)
                    }
                }






            } else{
                Toast.makeText(activity,&quot;Please enter your query..&quot;, 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 -&gt;

        selectedItemPosition = holder.adapterPosition

        view.showContextMenu()
        true
    }


    when(seder){
        &quot;user&quot; -&gt; (holder as UserMessageViewHolder).userMsgTV.setText(messageList.get(position).message)
        &quot;bot&quot; -&gt; (holder as BotMessageViewHolder).botMsgTV.setText(messageList.get(position).message)
        &quot;wr&quot; -&gt; (holder as WrMessageViewHolder).WrMsgTV.setText(messageList.get(position).message)
    }
}

  • А где эти строчки и что значит "ломается"? Если приложение падает - будьте добры приложить лог ошибки – woesss Dec 20 '23 at 13:31
  • Какие именно "строчки" Я в дебаге смотрел, когда дохожу до сюда вылетает приложение textuser = view.findViewById(R.id.idTVUser) есть догадка, что idTVUser ещё не появился в Списке, а он уже ищет его – Navsikaya Dec 20 '23 at 13:54
  • "Строчки" на которых вылетает. В каком месте вы их вызываете? И ещё раз повторяю Если приложение падает - лог ошибки в вопрос (У меня просят стектрейс (Stack Trace) или логкат (Logcat). Что это?) – woesss Dec 20 '23 at 14:49
  • Я обновил текст, может быть поможет, уже ничего не вылетает, просто не отображается контексменю – Navsikaya Dec 20 '23 at 20:15
  • Вы загадили вопрос кусками кода, оторванными от контекста - от этого не стало понятнее нисколько. Вот что такое messageRV? Если это RecyclerView, то регистрировать его бесполезно - он не реализует контекстное меню. Нужно вешать меню на элементы списка при их создании в адаптере. – woesss Dec 20 '23 at 20:45
  • lateinit var messageList: ArrayList messageList = ArrayList() messageRVAdapter = MessageRVAdapter(messageList)
        messageRV.adapter = messageRVAdapter
    

    registerForContextMenu(messageRV)

    это messageRV

    – Navsikaya Dec 20 '23 at 21:02
  • это всё создаётся в onViewCreated() Но по идеи она должна обновляться когда я отправил сообщение и появился мой текст справа – Navsikaya Dec 20 '23 at 21:04
  • Добавил весь код onViewCreated(), Остальное всё добавлено. Что нужно ещё добавить? – Navsikaya Dec 20 '23 at 21:10
  • А, ну я вам уже написал, что RecyclerView не реализует контекстное меню. Нужно или прикручивать его в адаптере на каждый элемент или кастомизировать RecyclerView. Варианты можете посмотреть тут https://stackoverflow.com/questions/26466877/how-to-create-context-menu-for-recyclerview – woesss Dec 21 '23 at 07:33
  • В общем, я добавил код в onBindViewHolder который находится в адаптаре, у меня отображается контекстное меню! Но теперь другая проблема. Я забыл добавить в переменную lateinit var textuser: TextView то что она выдает ошибку "lateinit property textuser has not been initialized" Не могу понять в какой момент мне нужно ещё инициализировать – Navsikaya Dec 21 '23 at 08:33
  • Если метод который у меня реализован фигня, то тогда лучше сделать просто получение текста из RecyclerView. Как лучше и где реализовать? – Navsikaya Dec 21 '23 at 08:51
  • Другая проблема - другой вопрос. Это сайт формата QA, а не форум. И задавайте вопросы так, чтобы они были понятны не только вам. Вы спрашиваете про переменную textuser, которой в текстах вопроса вообще не наблюдается - откуда мы должны знать что вы там с ней делаете. Прочтите на досуге справку [ask] – woesss Dec 21 '23 at 09:04
  • Смотрите, принципе всё работает, осталось только когда я нажимаю "Копировать" или "Удалить" (Это пункты контекстного меню) мне нужно чтобы RecyclerView понимал что именно у этого элемента он может копировать текс или вовсе удалить из RecyclerView.

    какую ещё предоставить информацию или мне создать новый вопрос. Подскажите пожалуйста. Почти всё сделали )))

    – Navsikaya Dec 21 '23 at 09:13

0 Answers0