如何将 AppCompatActivity 更改为 Fragment?

如何解决如何将 AppCompatActivity 更改为 Fragment?

我是开发 android 应用程序的新手。

我想使用“Droid Speech”但我无法使用它,因为“Droid Speech”是由 AppCompatActivity 组成的。

我想知道如何将 AppCompatActivity 改成 Fragment。

这是我的代码

class DroidSpeechActivity : AppCompatActivity(),View.OnClickListener,OnDSListener,OnDSPermissionsListener {
    val TAG = "Activity_DroidSpeech"
    private var droidSpeech: DroidSpeech? = null
    private var finalSpeechResult: TextView? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        setContentView(R.layout.activity_droid_speech)

        droidSpeech =
            DroidSpeech(this,fragmentManager)
        droidSpeech!!.setonDroidSpeechListener(this)
        droidSpeech!!.setShowRecognitionProgressView(false)
        droidSpeech!!.setonestepResultVerify(true)
        droidSpeech!!.setRecognitionProgressMsgColor(Color.WHITE)
        droidSpeech!!.setonestepVerifyConfirmTextColor(Color.WHITE)
        droidSpeech!!.setonestepVerifyRetryTextColor(Color.WHITE)
        droidSpeech!!.setPreferredLanguage("ko-KR")
        finalSpeechResult = findViewById(R.id.finalSpeechResult)
        start.setonClickListener(this)
        stop.setonClickListener(this)
    }

    override fun onPause() {
        super.onPause()
        if (stop!!.visibility == View.VISIBLE) {
            stop!!.performClick()
        }
    }

    override fun onDestroy() {
        super.onDestroy()
        if (stop!!.visibility == View.VISIBLE) {
            stop!!.performClick()
        }
    }

    override fun onClick(view: View) {
        when (view.id) {
            R.id.start -> {

                // Starting droid speech
                droidSpeech!!.startDroidSpeechRecognition()

                // Setting the view visibilities when droid speech is running
                start!!.visibility = View.GONE
                stop!!.visibility = View.VISIBLE
            }
            R.id.stop -> {

                // Closing droid speech
                droidSpeech!!.closeDroidSpeechOperations()
                stop!!.visibility = View.GONE
                start!!.visibility = View.VISIBLE
            }
        }
    }

    // MARK: DroidSpeechListener Methods
    override fun onDroidSpeechSupportedLanguages(currentSpeechLanguage: String,supportedSpeechLanguages: List<String>) {
        Log.i(TAG,"Current speech language = $currentSpeechLanguage")
        Log.i(TAG,"Supported speech languages = $supportedSpeechLanguages")
        if (supportedSpeechLanguages.contains("ko-KR")) {
            // Setting the droid speech preferred language as tamil if found
            droidSpeech!!.setPreferredLanguage("ko-KR")

            // Setting the confirm and retry text in tamil
            droidSpeech!!.setonestepVerifyConfirmText("check")
            droidSpeech!!.setonestepVerifyRetryText("no")
        }
    }

    override fun onDroidSpeechRmsChanged(rmsChangedValue: Float) {
    }

    override fun onDroidSpeechLiveResult(liveSpeechResult: String) {
        Log.i(TAG,"Live speech result = $liveSpeechResult")
    }

    override fun onDroidSpeechFinalResult(finalSpeechResult: String) {
        this.finalSpeechResult!!.text = finalSpeechResult
        println("test$finalSpeechResult")
        if (droidSpeech!!.continuousspeechRecognition) {
            val colorPallets1 = intArrayOf(Color.RED,Color.GREEN,Color.BLUE,Color.CYAN,Color.magenta)
            val colorPallets2 = intArrayOf(Color.YELLOW,Color.RED,Color.GREEN)

            // Setting random color pallets to the recognition progress view
            droidSpeech!!.setRecognitionProgressViewColors(if (Random().nextInt(2) == 0) colorPallets1 else colorPallets2)
        } else {
            stop!!.visibility = View.GONE
            start!!.visibility = View.VISIBLE
        }
    }

    override fun onDroidSpeechClosedByUser() {
        stop!!.visibility = View.GONE
        start!!.visibility = View.VISIBLE
    }

    override fun onDroidSpeechError(errorMsg: String) {
        Toast.makeText(this,errorMsg,Toast.LENGTH_LONG).show()
        stop!!.post {
            stop!!.performClick()
        }
    }

    // MARK: DroidSpeechPermissionsListener Method
    override fun onDroidSpeechAudioPermissionStatus(audioPermissionGiven: Boolean,errorMsgifAny: String) {
        if (audioPermissionGiven) {
            start!!.post {
                start!!.performClick()
            }
        } else {
            if (errorMsgifAny != null) {
                Toast.makeText(this,errorMsgifAny,Toast.LENGTH_LONG).show()
            }
            stop!!.post {
                stop!!.performClick()
            }
        }
    }
}

这是尝试更改代码...但错误

class DroidSpeechActivity : Fragment(),OnDSPermissionsListener {
    val TAG = "Activity_DroidSpeech"
    private var droidSpeech: DroidSpeech? = null
    private var finalSpeechResult: TextView? = null

    // MARK: Activity Methods
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        // Setting the layout;[.

        // Initializing the droid speech and setting the listener

        droidSpeech =
            DroidSpeech(activity?.applicationContext,activity?.getFragmentManager())
        droidSpeech!!.setonDroidSpeechListener(this)
        droidSpeech!!.setShowRecognitionProgressView(false)
        droidSpeech!!.setonestepResultVerify(true)
        droidSpeech!!.setRecognitionProgressMsgColor(Color.WHITE)
        droidSpeech!!.setonestepVerifyConfirmTextColor(Color.WHITE)
        droidSpeech!!.setonestepVerifyRetryTextColor(Color.WHITE)
        droidSpeech!!.setPreferredLanguage("ko-KR")
        start.setonClickListener(this)
        stop.setonClickListener(this)
    }

    override fun onCreateView(
        inflater: LayoutInflater,container: ViewGroup?,savedInstanceState: Bundle?
    ): View? {
        return inflater.inflate(R.layout.activity_droid_speech,container,false)
    }

    override fun onPause() {
        super.onPause()
        if (stop!!.visibility == View.VISIBLE) {
            stop!!.performClick()
        }
    }

    override fun onDestroy() {
        super.onDestroy()
        if (stop!!.visibility == View.VISIBLE) {
            stop!!.performClick()
        }
    }

    // MARK: OnClickListener Method
    override fun onClick(view: View) {
        when (view.id) {
            R.id.start -> {

                // Starting droid speech
                droidSpeech!!.startDroidSpeechRecognition()

                // Setting the view visibilities when droid speech is running
                start!!.visibility = View.GONE
                stop!!.visibility = View.VISIBLE
            }
            R.id.stop -> {

                // Closing droid speech
                droidSpeech!!.closeDroidSpeechOperations()
                stop!!.visibility = View.GONE
                start!!.visibility = View.VISIBLE
            }
        }
    }

    // MARK: DroidSpeechListener Methods
    override fun onDroidSpeechSupportedLanguages(currentSpeechLanguage: String,"Supported speech languages = $supportedSpeechLanguages")
        if (supportedSpeechLanguages.contains("ko-KR")) {
            // Setting the droid speech preferred language as tamil if found
            droidSpeech!!.setPreferredLanguage("ko-KR")

            // Setting the confirm and retry text in tamil
            droidSpeech!!.setonestepVerifyConfirmText("check")
            droidSpeech!!.setonestepVerifyRetryText("no")
        }
    }

    override fun onDroidSpeechRmsChanged(rmsChangedValue: Float) {
        // Log.i(TAG,"Rms change value = " + rmsChangedValue);
    }

    override fun onDroidSpeechLiveResult(liveSpeechResult: String) {
        Log.i(TAG,"Live speech result = $liveSpeechResult")
    }

    override fun onDroidSpeechFinalResult(finalSpeechResult: String) {
        // Setting the final speech result
        this.finalSpeechResult!!.text = finalSpeechResult
        println("test$finalSpeechResult")
        if (droidSpeech!!.continuousspeechRecognition) {
            val colorPallets1 = intArrayOf(Color.RED,Color.GREEN)

            // Setting random color pallets to the recognition progress view
            droidSpeech!!.setRecognitionProgressViewColors(if (Random().nextInt(2) == 0) colorPallets1 else colorPallets2)
        } else {
            stop!!.visibility = View.GONE
            start!!.visibility = View.VISIBLE
        }
    }

    override fun onDroidSpeechClosedByUser() {
        stop!!.visibility = View.GONE
        start!!.visibility = View.VISIBLE
    }

    override fun onDroidSpeechError(errorMsg: String) {
        // Speech error
        stop!!.post { // Stop listening
            stop!!.performClick()
        }
    }

    // MARK: DroidSpeechPermissionsListener Method
    override fun onDroidSpeechAudioPermissionStatus(audioPermissionGiven: Boolean,errorMsgifAny: String) {
        if (audioPermissionGiven) {
            start!!.post { // Start listening
                start!!.performClick()
            }
        } else {
            if (errorMsgifAny != null) {
                // Permissions error
            }
            stop!!.post { // Stop listening
                stop!!.performClick()
            }
        }
    }
}

这是错误信息


java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.ImageView.setonClickListener(android.view.View$OnClickListener)' on a null object reference
        at com.example.Jachi3kki.DroidSpeechActivity.onCreateView(DroidSpeechActivity.kt:49)

DroidSpeechActivity.kt:49 行是这个

start.setonClickListener(this)

如何将我的 AppCompatActivity 转换为片段?

解决方法

您的代码有一些问题:

  1. 通常最好使用可选的 ? 运算符,并且不要强制使用 !! 进行强制转换以避免 NullPointerException 导致崩溃
  2. 您需要通过引用视图实例在 onCreateView 方法中初始化视图。
    与活动不同,片段不调用 setContentView 方法,因此您不能直接引用布局项。

在我的代码中,我使用了内联方法 setOnClickListener 并且我假设开始和停止是 Button, 如果不是这种情况,您只需要在声明中更改两个视图的类型即可。

尝试像这样更改片段的代码:

class DroidSpeechActivity : Fragment(),OnDSListener,OnDSPermissionsListener {

    val TAG = "Activity_DroidSpeech"

    private var droidSpeech: DroidSpeech? = null
    private var finalSpeechResult: TextView? = null
    private var start: Button? = null
    private var stop: Button? = null

    // MARK: Activity Methods
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        // Initializing the droid speech and setting the listener
        droidSpeech = DroidSpeech(requireActivity().applicationContext,requireActivity().getFragmentManager()).apply {
            setOnDroidSpeechListener(this)
            setShowRecognitionProgressView(false)
            setOneStepResultVerify(true)
            setRecognitionProgressMsgColor(Color.WHITE)
            setOneStepVerifyConfirmTextColor(Color.WHITE)
            setOneStepVerifyRetryTextColor(Color.WHITE)
            setPreferredLanguage("ko-KR")
        }
    }

    override fun onCreateView(
        inflater: LayoutInflater,container: ViewGroup?,savedInstanceState: Bundle?
    ): View? {
        val view = inflater.inflate(R.layout.activity_droid_speech,container,false)

        finalSpeechResult = view.findViewById<TextView>(R.id.finalSpeechResult)

        start = view.findViewById<Button>(R.id.start).apply {
            setOnClickListener { startClicked() }
        }
        stop = view.findViewById<Button>(R.id.start).apply {
            setOnClickListener { stopClicked() }
        }

        return view
    }

    override fun onPause() {
        super.onPause()
        
        if (stop?.visibility == View.VISIBLE) {
            stop?.performClick()
        }
    }

    override fun onDestroy() {
        super.onDestroy()
        
        if (stop?.visibility == View.VISIBLE) {
            stop?.performClick()
        }
    }

    private fun startClicked() {
        droidSpeech?.startDroidSpeechRecognition()

        // Setting the view visibilities when droid speech is running
        start?.visibility = View.GONE
        stop?.visibility = View.VISIBLE
    }

    private fun stopClicked() {
        droidSpeech?.closeDroidSpeechOperations()

        stop?.visibility = View.GONE
        start?.visibility = View.VISIBLE
    }

    // MARK: DroidSpeechListener Methods
    override fun onDroidSpeechSupportedLanguages(currentSpeechLanguage: String,supportedSpeechLanguages: List<String>) {
        Log.i(TAG,"Current speech language = $currentSpeechLanguage")
        Log.i(TAG,"Supported speech languages = $supportedSpeechLanguages")
        if (supportedSpeechLanguages.contains("ko-KR")) {
            // Setting the droid speech preferred language as tamil if found
            droidSpeech?.setPreferredLanguage("ko-KR")

            // Setting the confirm and retry text in tamil
            droidSpeech?.setOneStepVerifyConfirmText("check")
            droidSpeech?.setOneStepVerifyRetryText("no")
        }
    }

    override fun onDroidSpeechRmsChanged(rmsChangedValue: Float) {
        // Log.i(TAG,"Rms change value = " + rmsChangedValue);
    }

    override fun onDroidSpeechLiveResult(liveSpeechResult: String) {
        Log.i(TAG,"Live speech result = $liveSpeechResult")
    }

    override fun onDroidSpeechFinalResult(finalSpeechResult: String) {
        // Setting the final speech result
        finalSpeechResult?.text = finalSpeechResult
        println("test$finalSpeechResult")
        if (droidSpeech?.continuousSpeechRecognition == true) {
            val colorPallets1 = intArrayOf(Color.RED,Color.GREEN,Color.BLUE,Color.CYAN,Color.MAGENTA)
            val colorPallets2 = intArrayOf(Color.YELLOW,Color.RED,Color.GREEN)

            // Setting random color pallets to the recognition progress view
            droidSpeech?.setRecognitionProgressViewColors(if (Random().nextInt(2) == 0) colorPallets1 else colorPallets2)
        } else {
            stop?.visibility = View.GONE
            start?.visibility = View.VISIBLE
        }
    }

    override fun onDroidSpeechClosedByUser() {
        stop?.visibility = View.GONE
        start?.visibility = View.VISIBLE
    }

    override fun onDroidSpeechError(errorMsg: String) {
        // Speech error
        stop?.post { // Stop listening
            stop?.performClick()
        }
    }

    // MARK: DroidSpeechPermissionsListener Method
    override fun onDroidSpeechAudioPermissionStatus(audioPermissionGiven: Boolean,errorMsgIfAny: String) {
        if (audioPermissionGiven) {
            start?.post { // Start listening
                start?.performClick()
            }
        } else {
            if (errorMsgIfAny != null) {
                // Permissions error
            }
            stop?.post { // Stop listening
                stop?.performClick()
            }
        }
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?