我在EditText的文本中搜索了一些单词。经过一些逻辑后,我得到了这些单词的索引。索引存储在arrayList>中。
然后我使用此功能突出显示这些单词的颜色。
public void changeColor(EditText et, ArrayList<ArrayList<Integer>> arr) {
Spannable wordtoSpan = new SpannableString(et.getText());
if (arr==null) return;
for (int i=0; i<arr.size(); i++){
wordtoSpan.setSpan(new BackgroundColorSpan(Color.BLUE), arr.get(i).get(0),
arr.get(i).get(1), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
et.setText(wordtoSpan, TextView.BufferType.SPANNABLE);
System.out.println("i'm changing color now");
}
}
然而,即使循环按字数的次数执行,也只有第一个单词突出显示。 我试图用TextView替换EditText,但仍然只有一个单词高亮显示。 有人可以帮忙看看这里有什么问题吗?谢谢。
答案 0 :(得分:1)
它似乎是正确的,但最好用
替换你的代码public void changeColor(EditText et, ArrayList<ArrayList<Integer>> arr) {
Spannable wordtoSpan = new SpannableString(et.getText());
if (arr==null) return;
for (int i=0; i<arr.size(); i++){
wordtoSpan.setSpan(new BackgroundColorSpan(Color.BLUE), arr.get(i).get(0),
arr.get(i).get(1), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
System.out.println("i'm changing color now");
}
et.setText(wordtoSpan);
}
如果在此更改后,您的问题仍然存在,我认为它可能与您的字符串索引相关&#34; arr&#34;
答案 1 :(得分:1)
我不确定但是由于使用for或while循环编辑文本和textview的行为,可能会发生这种情况。你不能用for循环来实现这种行为。我试图为卡拉OK应用程序做同样的事情,终于能够使用runnable和handler来做到这一点。尝试使用以下代码。
`String text = yourEditText.getText().toString();
final String[] wordArray = text.split(" ");
final Handler handler = new Handler();
final String[] selString = new String[1];
Runnable runnable = new Runnable() {
int i=0;
@Override
public void run() {
selString[0] = wordArray[i];
i++;
String str = et.getText().toString().replaceAll(selString[0], "<font color='red'>"+ selString[0] +"</font>");
((EditText)et).setText(Html.fromHtml(str), TextView.BufferType.SPANNABLE);
if(i<wordArray.length)
handler.postDelayed(this,500);
}
};
handler.post(runnable);`
代码获取用户在编辑文本中输入的文本,使用空格分割,并逐个突出显示500 mil的时间间隔。
答案 2 :(得分:1)
这就是我正在使用的。
public void setHighLightedText(EditText editText, String textToHighlight) {
String tvt = editText.getText().toString();
int ofe = tvt.indexOf(textToHighlight, 0);
Spannable WordtoSpan = new SpannableString(editText.getText());
for (int ofs = 0; ofs < tvt.length() && ofe != -1; ofs = ofe + 1) {
ofe = tvt.indexOf(textToHighlight, ofs);
if (ofe == -1)
break;
else {
WordtoSpan.setSpan(new BackgroundColorSpan(0xFFFFFF00), ofe, ofe + textToHighlight.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
editText.setText(WordtoSpan, TextView.BufferType.SPANNABLE);
}
}
}