Android 在ContextChanged侦听器内调用Editable.ClearPans()时,Edittext冻结

Android 在ContextChanged侦听器内调用Editable.ClearPans()时,Edittext冻结,android,kotlin,Android,Kotlin,如果我开始键入编辑文本,下面的代码将崩溃。 但是,如果我在侦听器前面的编辑文本中设置了一些字符串,如“Hello asdf”,代码将按预期运行;“asdf”字符串将以粗体显示,直到我清除字符串末尾的“f”,编辑文本界面将冻结,但不会崩溃。 问题似乎出在It?.clearSpans()方法上 有什么想法吗 editText.addTextChangedListener { val TEXT = "asdf" if (it?.contains(TEXT) == true) {

如果我开始键入编辑文本,下面的代码将崩溃。 但是,如果我在侦听器前面的编辑文本中设置了一些字符串,如
“Hello asdf”
,代码将按预期运行;
“asdf”
字符串将以粗体显示,直到我清除字符串末尾的“f”,编辑文本界面将冻结,但不会崩溃。 问题似乎出在
It?.clearSpans()方法上

有什么想法吗

editText.addTextChangedListener {
    val TEXT = "asdf"
    if (it?.contains(TEXT) == true) {
        val i = it.toString().indexOf(TEXT)
        it.setSpan(
            StyleSpan(Typeface.BOLD),
            i,
            i + TEXT.length,
            Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
        )
    } else {
        it?.clearSpans()
    }
}

清除span后,会再次触发
textChangedListener
,因此它会进入一个无限循环

您需要一个退出条件来停止此操作。可能会检查文本是否已为空:

    editText.addTextChangedListener {
        if(!it.toString().isBlank()) {
                    val TEXT = "asdf"
                    if (it?.contains(TEXT) == true) {
                        val i = it.toString().indexOf(TEXT)
                        it.setSpan(
                                StyleSpan(Typeface.BOLD),
                                i,
                                i + TEXT.length,
                                Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
                        )
                    } else {
                        it?.clearSpans()
                    }
                }
    }

清除span后,会再次触发
textChangedListener
,因此它会进入一个无限循环

您需要一个退出条件来停止此操作。可能会检查文本是否已为空:

    editText.addTextChangedListener {
        if(!it.toString().isBlank()) {
                    val TEXT = "asdf"
                    if (it?.contains(TEXT) == true) {
                        val i = it.toString().indexOf(TEXT)
                        it.setSpan(
                                StyleSpan(Typeface.BOLD),
                                i,
                                i + TEXT.length,
                                Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
                        )
                    } else {
                        it?.clearSpans()
                    }
                }
    }

它是如何崩溃的?你有stacktrace吗?它是如何崩溃的?你有stacktrace吗?我不认为有无限循环。即使我在textChangedListener之外调用editText.text.ClearPans(),而不设置任何侦听器,editText ui仍将冻结。clearSpans方法仍然是问题所在。我不认为存在无限循环。即使我在textChangedListener之外调用editText.text.ClearPans(),而不设置任何侦听器,editText ui仍将冻结。clearSpans方法仍然是个问题。