【问题标题】:How to Replace multiple string on a TexView for SpannableStrings?如何将 TextView 上的多个字符串替换为 Spannable Strings?
【发布时间】:2013-11-21 23:13:15
【问题描述】:

我正在寻找一种在 TextView 上查找不同字符串并将其替换为样式化 SpannableStrings 的方法。

我在How to use SpannableString with Regex in android? 中找到了这段代码,它只对单个字符串执行此操作:

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);
    }

}

这很好用,但我不确定如何调整它以使用多个字符串。 我尝试使用 SpannableStringBuilder.replace 重新实现它,这样我就可以多次运行该方法,同时保持以前的样式但失败了。

有什么想法吗?

谢谢!

【问题讨论】:

    标签: android replace textview spannablestring


    【解决方案1】:

    这很好用,但我不确定如何调整它以使用多个字符串。

    即兴发挥……

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

    第 2 步:修改 onCreate() 以从 dispStr 创建一个 SpannableString 并将其传递给 changeTextinView(),然后将 SpannableString 传递给 TextView 上的 setText()。

    此时,它应该像以前一样工作,只是您可以这样做:

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

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

    【讨论】:

    • 很好,很简单。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2013-06-14
    • 2017-01-29
    • 1970-01-01
    • 2011-09-01
    • 1970-01-01
    相关资源
    最近更新 更多