在函数内更新 textview

Update textview inside a function

我是新来的,这是我的第一个 post! 我尝试学习 Android 应用程序开发,但遇到了这个问题:

如何更新函数内的文本视图?我编写了一个小应用程序,它生成所有重复排列并将其写入文本视图。

有效,但文本视图仅在所有排列结束时更新...不明白为什么...

对不起,如果我的英语不好,我是法国人 ;)

我尝试使用 Thread,应用程序没有崩溃,它似乎可以运行,但应用程序直接进入后台...

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        permutation2("abcdefgh", 8)
    }

    private fun permutation1(text: String, prefix: String, n: Int, k: Int): String {

        if (k == 0) {
        } else
            for (i in 0..n) {
                val newprefix = prefix + text[i]
                if (newprefix.length >= text.length) {
                    zoneTexte.text = newprefix
                }
                permutation1(text, newprefix, n, k - 1)
            }
        return "Erreur"
    }

    private fun permutation2(text: String, k: Int) {
        permutation1(text, "", text.length - 1, k)
    }
}

排列函数运行良好,但 textview 仅在最后更新(最后一个排列 "hhhhhhhh"),我想为每个排列更新它。

onCreate 在 ui 线程上执行,permutation1() 和 permutation2() 也是如此。在 onCreate 完成之前 ui 不会真正刷新,然后 ui 可以 refresh/redraw 屏幕,所以这就是为什么你直到结束才看到任何增量文本更新。

如果您想看到它的实时更新,您可能需要查看 AsyncTask。在您的特定示例中,您并没有真正执行一项很长的 运行 任务,所以我不确定即使您使用 AsyncTask,您是否能够看到 TextView 的增量添加。

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        permutation2("abcdefgh", 8)
    }


    private fun permutation2(text: String, k: Int) {
        MyCal().execute(text)
    }

    inner class MyCal : AsyncTask<String ,String, String>(){
        override fun onProgressUpdate(vararg values: String?) {
            super.onProgressUpdate(*values)
            zoneTexte.text = values[0]

        }

        override fun onPostExecute(result: String?) {
            super.onPostExecute(result)
            zoneTexte.text = result
        }

        override fun doInBackground(vararg p0: String?): String {
            return permutation1(p0[0]!!, "", p0[0]!!.length?.minus(1), 8)
        }

        fun permutation1(text: String, prefix: String, n: Int, k: Int): String {
            if (k == 0) {
            } else
                for (i in 0..n) {
                    val newprefix = prefix + text[i]
                    if (newprefix.length >= text.length) {
                        onProgressUpdate(newprefix)
                        return newprefix
                    }
                    permutation1(text, newprefix, n, k - 1)
                }
            return "Erreur"
        }
    }
}

在 Mark 和 Kishan 的帮助下,我找到了解决方案!谢谢你们!

这是代码:

class MainActivity : AppCompatActivity() {

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    permutation2("abcdefgh", 8)

}


private fun permutation2(text: String, k: Int) {
    MyCal().execute(text)
}

inner class MyCal : AsyncTask<String ,String, String>(){
    override fun onProgressUpdate(vararg values: String?) {
        super.onProgressUpdate(*values)
        runOnUiThread(Runnable { zoneTexte.text = values[0] })

    }

    override fun onPostExecute(result: String?) {
        super.onPostExecute(result)
        runOnUiThread(Runnable { zoneTexte.text = result })
    }

    override fun doInBackground(vararg p0: String?): String {
        return permutation1(p0[0]!!, "", p0[0]!!.length?.minus(1), 8)
    }

    fun permutation1(text: String, prefix: String, n: Int, k: Int): String {
        if (k == 0) {
        } else
            for (i in 0..n) {
                val newprefix = prefix + text[i]
                if (newprefix.length >= text.length) {
                    onProgressUpdate(newprefix)
                    return newprefix
                }
                permutation1(text, newprefix, n, k - 1)
            }
        return "Erreur"
    }
}

}