Android 如何替换TexView上的多个字符串以获得SpannableStrings?

Android 如何替换TexView上的多个字符串以获得SpannableStrings?,android,replace,textview,spannablestring,Android,Replace,Textview,Spannablestring,我正在寻找一种在TextView上查找不同字符串的方法,并用样式化的SpannableString替换它们 我在中找到了这段代码,它只对单个字符串执行此操作: public class SpanTest extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setConte

我正在寻找一种在TextView上查找不同字符串的方法,并用样式化的SpannableString替换它们

我在中找到了这段代码,它只对单个字符串执行此操作:

public class SpanTest extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        String dispStr = "This has the string ABCDEF in it \nSo does this :ABCDEF - see!\nAnd again ABCD here";
        TextView tv = (TextView) findViewById(R.id.textView1);
        tv.setText(dispStr);
        changeTextinView(tv, "ABC", Color.RED);
    }

    private void changeTextinView(TextView tv, String target, int colour) {
        String vString = (String) tv.getText();
        int startSpan = 0, endSpan = 0;
        Spannable spanRange = new SpannableString(vString);

        while (true) {
            startSpan = vString.indexOf(target, endSpan);
            ForegroundColorSpan foreColour = new ForegroundColorSpan(colour);
            // Need a NEW span object every loop, else it just moves the span
            if (startSpan < 0)
                break;
            endSpan = startSpan + target.length();
            spanRange.setSpan(foreColour, startSpan, endSpan,
                    Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
        }
        tv.setText(spanRange);
    }

}
public类测试扩展活动{
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
String dispStr=“这里面有字符串ABCDEF\n这样做:ABCDEF-请参阅!\n然后再次单击此处”;
TextView tv=(TextView)findViewById(R.id.textView1);
tv.setText(dispStr);
更改文本视图(电视,“ABC”,颜色为红色);
}
私有void changeTextinView(文本视图电视、字符串目标、int颜色){
String vString=(String)tv.getText();
int startSpan=0,endSpan=0;
Spannable spanRange=新SpannableString(vString);
while(true){
startSpan=vString.indexOf(target,endSpan);
ForegroundColorSpan foreColour=新的ForegroundColorSpan(颜色);
//每个循环都需要一个新的跨度对象,否则它只会移动跨度
如果(起始跨距<0)
打破
endSpan=startSpan+target.length();
跨距范围。设置跨距(前幅、起始跨距、结束跨距、,
Spannable.SPAN_独占性SPAN_独占性);
}
tv.setText(spanRange);
}
}
这非常有效,但我不确定如何调整它以使用多个字符串。 我尝试使用SpannableStringBuilder.replace重新实现它,以便在保持以前的样式的同时可以多次运行该方法,但失败了

有什么想法吗

谢谢

这非常有效,但我不确定如何调整它以使用多个字符串

即兴

步骤1:更改
changeTextinView()
SpannableString
作为第一个参数,而不是
TextView

步骤2:修改
onCreate()
dispStr
创建
SpannableString
,并将其传递到
changeTextinView()
,然后获取
SpannableString
并将其传递到
TextView
上的
setText()

在这一点上,它应该像以前一样工作,但您将能够执行以下操作:

步骤3:连续调用
changeTextinView()
多次,每个字符串一次


如果有重叠,事情会变得有些混乱(例如,你想用一种方式格式化
ABCDEF
而用另一种方式格式化
CDE
),但我希望你不是这样。

非常好,非常简单。谢谢