如何在不丢失其样式和颜色的情况下替换 TextView 的 String

How to replace String of TextView without losing its style and color

我将 HTML 模式设置为我的 TextView,因此在我的文本中一些字符串为蓝色或绿色。现在我需要在不丢失蓝色和绿色的情况下将“旧”替换为“新”。如果使用 textview.setText(textview.getText().toString().repaceAll("old", "new")),我们将失去其样式和颜色!事实上,我需要保留样式的代码。或者我需要在不丢失其样式和颜色的情况下替换 Spanned 中的字符串。

  1. 我需要替换 Spanned obj 中的字符串
  2. 我需要将 Spanned obj 设置为我的 TextView。但是我不知道怎么办。

我能想到的唯一方法是使用 SpannableStringBuilderSpannableCharSequencetextview.getText() returns 也是 CharSequence。如果您避免 toString 转换,样式将不会丢失。 SpannableStringBuilder 还有一个 replace 函数

旧字符串是 oldstr,新字符串是 newstr

    Spanned spanned = textView.getText();
    
    CharSequence charSequence = spanned;
    SpannableStringBuilder stringBuilder = (SpannableStringBuilder) spanned;

    for (int i = 1; i < charSequence.length() - 6; i++) {
        if (charSequence.charAt(i) == 'o' &&
                charSequence.charAt(i+1) == 'l' &&
                charSequence.charAt(i+2) == 'd' &&
                charSequence.charAt(i+3) == 's' &&
                charSequence.charAt(i+4) == 't' &&
                charSequence.charAt(i+5) == 'r') {
            stringBuilder.replace(i-1, i+6, "newstr");
        }
    }

    spanned = stringBuilder;
    textView.setText(spanned);