Как перейти к следующему действию при нажатии на текстовое представление kotlin - PullRequest
0 голосов
/ 13 апреля 2019

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

class STTFragment : Fragment() {
lateinit var recognizer: SpeechRecognizer
lateinit var chatPresenter: IChatPresenter
private val thisActivity = activity

override fun onAttach(context: Context?) {
    super.onAttach(context)
    chatPresenter = ChatPresenter(requireContext())
}

@NonNull
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
    val rootView = inflater.inflate(R.layout.fragment_sttframe, container, false)
    if (thisActivity is ChatActivity)
        thisActivity.fabsetting.hide()
    promptSpeechInput()
    setupCommands(rootView)
    return rootView
}

private fun setupCommands(rootView: View) {
    var voiceCommand = getResources().getStringArray(R.array.voiceCommands)
    var voiceCommandsList = voiceCommand.toCollection(ArrayList())
    rootView.clickableCommands.layoutManager = LinearLayoutManager(activity, LinearLayoutManager.HORIZONTAL, false)
    rootView.clickableCommands.adapter = VoiceCommandsAdapter(voiceCommandsList, activity)


}

Это sttFragment класс

class VoiceCommandsAdapter(val items: ArrayList<String>, val context: Context?) : RecyclerView.Adapter<VoiceCommandsAdapter.ViewHolder>() {
    lateinit var chatPresenter: IChatPresenter

    override fun onCreateViewHolder(parent: ViewGroup, p1: Int): ViewHolder {
        chatPresenter = ChatPresenter(context as Context)
        return ViewHolder(LayoutInflater.from(context).inflate(R.layout.item_voice_commands, parent, false))

    }

    override fun onBindViewHolder(holder: ViewHolder, position: Int) {

        holder?.voiceCommand?.text = items.get(position)
    }

    override fun getItemCount(): Int {
        return items.size
    }

    inner class ViewHolder(view: View) : RecyclerView.ViewHolder(view) {
        val voiceCommand: TextView = view.voiceCommand

        init {
            view.setOnClickListener {
                val chatMessage = items[adapterPosition]
                val splits = chatMessage.split("\n".toRegex()).dropLastWhile { it.isEmpty() }
                val message = splits.joinToString(" ")
                if (!chatMessage.isEmpty()) {
                    chatPresenter.sendMessage(message, items[adapterPosition])

                }


            }
        }

    }
}

Это класс voicecommandAdapter . Как я могу изменить код так, чтобы, как только я щелкнул по команде, он перешел к другому занятию.

Не следует ждать до истечения времени ожидания распознавателя.

1 Ответ

0 голосов
/ 13 апреля 2019

Я постараюсь быть максимально кратким и ясным. Правильный способ сделать это будет:

  1. Реализация View.OnClickListener для вашего фрагмента
    Вам также потребуется реализовать метод onClick в вашем фрагменте. Внутри него вы можете запустить навигацию к другому действию.
  2. Добавьте еще один аргумент в конструктор адаптера:
    VoiceCommandsAdapter(val items: ArrayList<String>, val context: Context?, val clickListener: View.OnClickListener)
  3. Переопределить функцию onClick() в вашем адаптере
  4. В вашем onBindViewHolder добавьте прослушиватель кликов в TextView

    holder?.voiceCommand?.text.setOnClickListener {clickListener.onClick()}

Примечание перед следующим и последним шагом: вы просто передаете обратный вызов с помощью щелчка на свой адаптер, чтобы при щелчке в TextView он возвращался к функции onClick(View) фрагмента.
Это хорошая практика, потому что вы хотите сделать следующий шаг в своем фрагменте, это навигационная часть.
В качестве альтернативы здесь можно было бы передать экземпляр вашей активности в адаптер и обработать там логику навигации, но это плохая практика (передавать экземпляры активности / фрагмента вокруг)

  1. Перейдите к новому действию в onClick(View) в вашем STTFragment
    Внутри вашей функции onClick(View) вы будете запускать навигационную логику. Для этого просто добавьте:
    val intent = Intent(activity, TargetActivity.class)
    activity.startActivity(intent)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...