android - 通过迭代失败按多个跨度样式设置文本

标签 android text styles spannablestring

我通过多个跨度样式设置了几个单词,当我将带有样式的数组传递给方法时,结果只有最后一个单词具有该样式。它省略了其他词。为什么?在我的代码和执行下面。提前谢谢你。

//execution in code
charSequence = SpannableUtils.format(
        charSequence,
        new ParcelableSpan[]{new StyleSpan(Typeface.BOLD)},//or more
        new String[]{"Test1", "Test2"}
);

//method
public static CharSequence format(CharSequence charSequence, ParcelableSpan[] spans, String[] words) {
    SpannableStringBuilder ssb = new SpannableStringBuilder(charSequence);

    for (String word : words) {
        Pattern pattern = Pattern.compile(Pattern.quote(word));
        Matcher matcher = pattern.matcher(charSequence);

        for (ParcelableSpan span : spans) {
            while (matcher.find()) {
                ssb.setSpan(span, matcher.start(), matcher.end(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
            }
        }
    }

    return ssb;
}

但是,如果我使用“instance of”检查跨度类型,然后创建新的构造函数,它就可以工作。为什么?

最佳答案

您不能多次应用同一个跨度对象。所有先前设置的跨度都将被丢弃,因此只有最后一个单词具有跨度。

如果你想重用它,你必须用CharacterStyle.wrap()复制它在你应用它之前:

while (matcher.find()) {
    ssb.setSpan(CharacterStyle.wrap(span), matcher.start(), matcher.end(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
}

关于android - 通过迭代失败按多个跨度样式设置文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34697160/

相关文章:

java - 统计特定时间段内的数字,Java,Android

java - DebugView 没有可用的设备

database - 为什么Elasticsearch不返回包含几乎相等词的文档?

c++ - 使用 FreeType/GLFW 根本不呈现文本

javascript - 如何在 openlayers 4 中设置点样式

android - 如何在 TabLayout 中的选项卡之间添加边距?

android - 在 Android 中每次构建后自动增加版本代码

javascript - ContentEditable - 获取当前字体颜色/大小

c# - 如何将单元格样式应用于 DataGrid 单元格

android - 我可以在代码中更改 Android 样式的父项吗?