SpannableString重复使用在textview里的排版问题自动换行

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpannableString重复使用在textview里的排版问题自动换行相关的知识,希望对你有一定的参考价值。

android textview ,当使用SpannableString设置字体append到textview后 自动换行就把界面搞乱,特别是一个字使用多个SpannableString的时候,比如同时加粗和下划线,就不满一行就换行。textview是重写的,ondraw()没有重写,找不到解决办法。求高人解决。

请参照下面链接的解决办法,这其实是中英文混用,半角字符与全角字符混乱所致:
http://niufc.iteye.com/blog/1729792
参考技术A 哥们,这个问题怎么样了?

从 SpannableStringBuilder 获取 SpannableString 的最佳方法

【中文标题】从 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

【讨论】:

以上是关于SpannableString重复使用在textview里的排版问题自动换行的主要内容,如果未能解决你的问题,请参考以下文章

SpannableString与SpannableStringBuilder使用

Android 中实现特殊符号㎡ 的显示 使用SpannableString类来实现

自动适应 TextView 和 spannableString

使用 spannableString 在 android 中更改 TextView 文本的颜色

SpannableString与SpannableStringBuilder使用

使用 SpannableString 调整文本对齐方式