SpannableString使用注意(資料重複時,顯示異常問題解決)
阿新 • • 發佈:2019-01-07
之前我寫過一篇部落格介紹SpannableString的使用。
參見
http://blog.csdn.net/u014620028/article/details/50977602
但是今天發現我說的方法裡有個bug。這裡解決一下。在這裡,感謝我的組長–李曉明(美女)。她的方法比我的簡單。
初始化:
TextView tv_show = (TextView) findViewById(R.id.tv_show);
String content = "浪花淘33我英雄。是非成敗轉頭空,青山我舊在,幾度3夕陽紅。白我漁樵(qiáo)江渚(zhǔ)上,慣看我秋3月春風。一壺濁酒333喜相逢,古今33多少事,都付笑談中。" ;
SpannableString spannableString = new SpannableString(content);
首先,說明一下之前方法會出現的bug
1、程式碼:
ArrayList<String> list = new ArrayList<String>();
list.add("3");
for (int i = 0; i < list.size(); i++) {
final String temp = list.get(i);
String temp_content = content;
int start=0;
while (temp_content.contains(temp)) {
spannableString.setSpan(new ClickableSpan() {
@Override
public void updateDrawState(TextPaint ds) {
super .updateDrawState(ds);
ds.setColor(Color.BLUE);
ds.setUnderlineText(false);
}
@Override
public void onClick(View widget) {
Utils.showToast(MainActivity.this, "點選了" + temp);
}
}, start + temp_content.indexOf(temp), start + temp_content.indexOf(temp) + temp.length(),
Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
tv_show.setText(spannableString);
tv_show.setMovementMethod(LinkMovementMethod.getInstance());
start =temp_content.indexOf(temp) + temp.length();
temp_content = temp_content.substring(start);
}
}
效果圖:
說明:我要的效果,是把資料中的“3”,都變色,並且可以被點選。從效果圖上看,變換的資料都亂了。
bug解決:
ArrayList<String> list = new ArrayList<String>();
list.add("3");
for (int i = 0; i < list.size(); i++) {
final String temp = list.get(i);
String temp_content = content;
int startNew = 0;
int startOld = 0;
while (temp_content.contains(temp)) {
spannableString.setSpan(new ClickableSpan() {
@Override
public void updateDrawState(TextPaint ds) {
super.updateDrawState(ds);
ds.setColor(Color.BLUE);
ds.setUnderlineText(false);
}
@Override
public void onClick(View widget) {
Utils.showToast(MainActivity.this, "點選了" + temp);
}
}, startOld + temp_content.indexOf(temp), startOld + temp_content.indexOf(temp) + temp.length(),
Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
tv_show.setText(spannableString);
tv_show.setMovementMethod(LinkMovementMethod.getInstance());
startNew =temp_content.indexOf(temp) + temp.length();
startOld += startNew;
temp_content = temp_content.substring(startNew);
}
}
效果圖:
這裡,使用2個變數,記錄下一次的開始位置。避免一個數據重複出現時,開始位置計算錯誤的問題