从 SpannableStringBuilder 获取 SpannableString 的最佳方法

Posted

技术标签:

【中文标题】从 SpannableStringBuilder 获取 SpannableString 的最佳方法【英文标题】:Best way to get a SpannableString from a SpannableStringBuilder 【发布时间】:2014-06-04 11:55:54 【问题描述】:

我正在使用一个类似于 wiki 的解析器,它为一组标记标记创建跨度。它正在工作,但在令牌迭代器中,我经常需要将SpannableStringBuilder 上的部分结果转换为SpannableString。这经常被调用,所以我追求最有效的解决方案,并避免创建额外的对象。

目前我正在使用;

SpannableStringBuilder stuff=complex_routine_that_builds_it();
SpannableString result=SpannableString.valueOf(stuff);

然而,这个 valueOf 调用在内部构建了一个 SpannableString 类型,从头开始,执行一个 toString 和一个循环来复制分配的 spans

正如SpannableStringBuilder 的名字所暗示的那样,我认为也许有一种更快的方法可以从构建器那里获得SpannableString。是真的吗?

【问题讨论】:

如果你的文本中有一些跨度,你只需要 android.text.Spanned 是的,我现在明白了,SpannableStringBuilder 这个名字让我很困惑,我习惯使用StringBuffer,然后在最后得到一个String,并没有意识到SpannableStringBuilder还实现了SpannedCharsequence 等...构建器对我来说很方便,因为解析器对传入的字符串进行了大量操作以删除标记并创建许多不同的跨度:URL、颜色、大小...基本上我正在重写(非常)慢html.fromHtml 好主意,我不知道为什么,但这里 95% 的朋友使用 fromHtml,即使输入不是 html:他们先构建人工 html,然后调用 fromHtml,我找不到更愚蠢的东西 是的,如果您查看 Html.java 源代码,您只想死...它将字符串解析为 XML SaxParser (!),然后使用 100kb 库 Tagsoup 和无数常规检查格式正确的表达式、XML 模式和诸如此类的......仅支持粗体、斜体、标题和颜色,我用大约 150 行完成了这些,并且速度提高了 10 倍! 【参考方案1】:

当您可以直接使用SpannableStringBuilder 时,无需将SpannableString 转换为TextView,如TextView

SpannableStringBuilder stuff = complex_routine_that_builds_it();
textView.setText(stuff);

正如问题已经表明的那样,如果您绝对必须这样做,您可以进行转换

SpannableStringBuilder stuff = complex_routine_that_builds_it();
SpannableString result = SpannableString.valueOf(stuff);

但是您应该考虑为什么您甚至需要进行这种转换?只需使用原始的SpannableStringBuilder

SpannableStringSpannableStringBuilder

这两者的区别类似于StringStringBuilder的区别。 String 是不可变的,但您可以更改 StringBuilder 中的文本。

同样,SpannableString 中的文本是不可变的,而 SpannableStringBuilder 中的文本是可变的。但是,重要的是要注意,这仅适用于文本。它们的跨度(甚至是SpannableString)都可以更改。

相关

Android Spanned, SpannedString, Spannable, SpannableString and CharSequence

【讨论】:

以上是关于从 SpannableStringBuilder 获取 SpannableString 的最佳方法的主要内容,如果未能解决你的问题,请参考以下文章

SpannableString与SpannableStringBuilder使用

SpannableString与SpannableStringBuilder使用

在 TextView 中使用 SpannableStringBuilder 的段落间距

使用 SpannableStringBuilder 时,为啥我的文本没有以样式显示?

SpannableStringBuilder 用正则表达式替换内容

SpannableStringBuilder