Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何单击textview kotlin转到下一个活动_Android_Kotlin - Fatal编程技术网

Android 如何单击textview kotlin转到下一个活动

Android 如何单击textview kotlin转到下一个活动,android,kotlin,Android,Kotlin,我使用了TextView,并使其在Kotlin中可点击。这是一个语音识别应用程序,只要我单击textview,我希望它进入另一个活动 class STTFragment : Fragment() { lateinit var recognizer: SpeechRecognizer lateinit var chatPresenter: IChatPresenter private val thisActivity = activity override fun onAttach(contex

我使用了TextView,并使其在Kotlin中可点击。这是一个语音识别应用程序,只要我单击textview,我希望它进入另一个活动

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)


}
这就是sttframent

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])

                }


            }
        }

    }
}
class VoiceCommandsAdapter(val项:ArrayList,val上下文:context?):RecyclerView.Adapter(){
lateinit var chatPresenter:IChatPresenter
override onCreateViewHolder(父级:ViewGroup,p1:Int):ViewHolder{
chatPresenter=chatPresenter(上下文作为上下文)
返回ViewHolder(LayoutFlater.from(上下文)。充气(R.layout.item\u voice\u命令,父项,false))
}
覆盖BindViewHolder(holder:ViewHolder,位置:Int){
holder?.voiceCommand?.text=项目。获取(位置)
}
重写getItemCount():Int{
返回项目。大小
}
内部类ViewHolder(视图:视图):RecyclerView.ViewHolder(视图){
val voiceCommand:TextView=view.voiceCommand
初始化{
view.setOnClickListener{
val chatMessage=项目[适配器位置]
val splits=chatMessage.split(“\n”.toRegex()).dropLastWhile{it.isEmpty()}
val message=splits.joinToString(“”)
如果(!chatMessage.isEmpty()){
chatPresenter.sendMessage(消息,项[adapterPosition])
}
}
}
}
}
这是voicecommandAdapter类。 如何修改代码,使其在单击命令后立即转到其他活动

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)


}

它不应该等到识别器超时。

我会尽量简短明了。正确的方法是:

  • 将View.OnClickListener实现到您的片段中
    您还需要在片段中实现onClick方法。在它里面,是你触发导航到另一个活动的地方
  • 在适配器构造函数中再添加一个参数:
    VoiceCommandsAdapter(val项:ArrayList,val上下文:context?,val clickListener:View.OnClickListener)
  • 覆盖适配器中的
    onClick()
    函数
  • 在您的
    onBindViewHolder
    中,将单击侦听器添加到您的文本视图

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

  • 在下一步也是最后一步之前请注意:您所做的只是将单击回调传递给适配器,这样当您在TextView中单击时,它将返回到片段
    onClick(View)
    函数。
    这是一个很好的实践,因为您希望在片段中执行下一步,这就是导航部分
    这里的替代方法是将活动实例传递给适配器,并在其中处理导航逻辑,但这是一种糟糕的做法(传递活动/片段实例)

  • onClick(View)
    中导航到您的
    stt片段中的新活动

    onClick(View)
    函数中,您将触发导航逻辑。为此,只需添加:
    val intent=intent(活动,TargetActivity.class)

    activity.startActivity(intent)

  • kotlin不接受stTfFragments中的view.OnClickListener。如果要声明构造函数,则需要实现OnClickListener。您需要实现onClick方法:如果在windows或linux中执行alt+insert,然后选择ImplementMethods。在这里,您将找到onClick方法。只需选择它并按ok.rootView.setOnClickListener{val intent=intent(activity,ChatActivity::class.java)intent.flags=intent.FLAG\u activity\u CLEAR\u TOP或intent.FLAG\u activity\u NEW\u TASK startActivity(intent)我已经创建了这个,但它不会在单击后立即返回。您在哪里按后退,在设备上还是在后退按钮(左上角)?