我正在一个类似Wiki的解析器中工作,该解析器为一组标记 token 创建跨度。它正在工作,但是在 token 迭代器内部,我经常需要将SpannableStringBuilder
上的部分结果转换为SpannableString
。这经常被称为,所以我追求最有效的解决方案,并且避免创建额外的对象。
目前我正在使用;
SpannableStringBuilder stuff=complex_routine_that_builds_it();
SpannableString result=SpannableString.valueOf(stuff);
但是,此
valueOf
调用在内部从头开始构建SpannableString
类型,进行toString
和循环以复制分配的spans
。就像
SpannableStringBuilder
的名字所暗示的那样,我认为也许有一种更快的方法可以从生成器中获取SpannableString
。是真的吗 最佳答案
当您可以直接使用SpannableStringBuilder
时,无需将SpannableString
转换为TextView
,就像在SpannableStringBuilder
中一样:
SpannableStringBuilder stuff = complex_routine_that_builds_it();
textView.setText(stuff);
正如已经显示的问题,如果您绝对必须通过以下方式进行转换SpannableStringBuilder stuff = complex_routine_that_builds_it();
SpannableString result = SpannableString.valueOf(stuff);
但您应该考虑为什么还要进行这种转换?只需使用原始的SpannableString
即可。SpannableStringBuilder
和 String
两者之间的区别类似于
StringBuilder
和String
之间的区别。 StringBuilder
是不可变的,但是您可以更改SpannableString
中的文本。类似地,
SpannableStringBuilder
中的文本是不可变的,而SpannableString
中的文本是可变的。不过,重要的是要注意,这仅适用于文本。两者的跨度(甚至是ojit_code)都可以更改。相关的