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方法仍然是个问题。