【问题标题】:how to change AppCompatActivity to Fragment? [closed]如何将 AppCompatActivity 更改为 Fragment? [关闭]
【发布时间】:2021-04-30 14:40:21
【问题描述】:

我是开发安卓应用的新手。

我想使用“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.CYAN, Color.BLUE, 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(), View.OnClickListener,
    OnDSListener,
    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, 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
        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.CYAN, Color.BLUE, 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 转换为片段?

【问题讨论】:

  • 欢迎来到 Stack Overflow!与其让别人为你写这一切,你为什么不自己学习片段呢?然后你可以很容易地为你已经得到的东西想出一个粗略的等价物。
  • 我试图改变它,但我从上面的 setOnClickListeneras 得到一个错误:(
  • 你的问题标题根本没有这么说。如果您对某事有实际问题,那么问这个问题是有意义的。不管怎样,你研究过这个错误吗?
  • 哦...对不起。是的,我正在研究错误,先生。我尝试修复此错误...但我无法修复它。
  • 你找到这个问题了吗? stackoverflow.com/questions/218384/…

标签: android kotlin android-fragments fragment appcompatactivity


【解决方案1】:

您的代码有一些问题:

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

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

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

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.CYAN, Color.BLUE, 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()
            }
        }
    }
}

【讨论】:

  • 谢谢您,先生...这对我真的很有帮助谢谢...
  • 这实际上是对一个(可能完全不值得)问题的非常好的答案,做得好
猜你喜欢
  • 1970-01-01
  • 2021-05-17
  • 1970-01-01
  • 2017-11-22
  • 2016-04-20
  • 1970-01-01
  • 1970-01-01
  • 2016-06-04
  • 1970-01-01
相关资源
最近更新 更多