【发布时间】:2015-08-29 17:12:52
【问题描述】:
我已经知道有很多问题都在问同样的问题,但它们对我不起作用。这是代码(我使用代码为 EditText 中的文本部分着色)-
et_note.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
if (textCC.contains("sample_text")) {
String syntaxText = "sample_text";
int ofe = textCC.indexOf(syntaxText, 0);
int nextOfe = textCC.indexOf(syntaxText, ofe);
for (int ofs = 0; ofs < textCC.length() && ofe != -1 && nextOfe != -1; ofs = nextOfe + 1) {
ofe = textCC.indexOf(syntaxText, ofs);
nextOfe = textCC.indexOf(syntaxText, ofe + 1);
if (ofe == -1 || nextOfe == -1) {
break;
} else {
Spannable WordtoSpan = new SpannableString(et_note.getText());
WordtoSpan.setSpan(new ForegroundColorSpan(0xFF00FF00), ofe, nextOfe + 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
et_note.setText(WordtoSpan, TextView.BufferType.SPANNABLE);
}
}
}
}
@Override
public void afterTextChanged(Editable editable) {
}
});
它给出堆栈溢出错误。
有效但不合适的答案 -
1) 在代码前添加et_note.removeTextChangedListener(this) 并在代码后添加et_note.addTextChangedListener(this) - 这个工作但不正常,应用程序变得非常慢。
还有其他方法可以帮助我吗?谢谢。
【问题讨论】:
-
一方面,不要在观看的
EditText上致电setText()。不要根据EditText中的内容创建新的Spannable,只需使用从getText()返回的Spannable,并在其上设置跨度。 -
@CommonsWare 我该怎么做?我的意思是使用从 getText() 返回的 Spannable,并在其上设置跨度。
-
et_note似乎是EditText。 ThegetText()method onEditTextreturns anEditable。Editableis a sub-interface ofSpannable。setSpan()is a method defined onSpannable。因此,您可以在et_note.getText()返回的对象上调用setSpan()。
标签: android android-edittext stack-overflow textwatcher