Android提供了多种接口所有文字和字符串相关的:
Spanned
,SpannedString
,Spannable
,SpannableString
和CharSequence
.
我已经在各种场景中使用了上述所有内容,通常是在使用Html.fromHtml()
内部显示可链接文本之后TextView
,以便为其应用一些样式.
我试图从Android的官方文档中了解这些接口的用途/用法并且因为它很混乱而失败了.这些接口的目的是什么?在哪些情况下使用它们最常见?在哪些情况下最好避免使用它们?使用其中任何一个时,是否有任何明显的性能影响?
如果有人能提供一个体面的解释,我将不胜感激.
Com*_*are 143
这些接口的目的是什么?
CharSequence
是表示字符序列的标准Java接口.String
是最常用的具体实现CharSequence
,其次是StringBuilder
.
Spanned
是一个CharSequence
"spans",表示格式应用于文本的某些部分,这些部分不能修改.
Spannable
是一个Spanned
,添加了修改跨度的能力(添加或删除格式),但不修改文本本身.
SpannedString
是Spanned
接口的具体实现.
SpannableString
是Spannable
接口的具体实现.
在哪些情况下使用它们最常见?
当存在返回一个的方法(例如,getText()
在a上EditText
)或者存在将一个作为参数的方法时(例如,setText()
在a上TextView
).
您引用使用情况Html.fromHtml()
也许是最常见的传统Android开发,作为TextView
一个Spanned
在重量上要轻得多比是WebView
.但是,还有其他用例,例如:
在哪些情况下最好避免使用它们?
它们在对抗秃头,除雪,热泵修复,制作蛋奶酥等方面非常糟糕.
:-)
使用其中任何一个时,是否有任何明显的性能影响?
根据定义,接口没有"性能影响" - 它们仅仅是API的描述.
我不知道这SpannableString
比SpannedString
任何特定操作都要慢得多.然而,SpannableStringBuilder
(它允许在除了格式化文本跨度操纵文本)可能比慢一点SpannableString
或SpannedString
用于各种事情.但是,性能差异是否足以影响将取决于使用情况.
Sur*_*gch 34
A String
是不可变的(即文本不能改变).它也没有与之相关的任何跨度.(跨度是文本的范围,包括颜色,突出显示,斜体,链接等样式信息.)因此,您可以使用String
何时不需要更改文本,也不需要任何样式.
A StringBuilder
具有可变文本,因此您可以在不创建新对象的情况下对其进行修改.但是,它没有任何跨度信息.这只是纯文本.因此,StringBuilder
当您需要更改文本时使用a ,但您不关心它的样式.
A SpannedString
具有不可变文本(如a String
)和不可变跨度信息.它是Spanned
接口定义的要求的具体实现.SpannedString
当文本具有样式时使用a ,但在创建文本或样式后不需要更改它.
注意:没有这样的东西,SpannedStringBuilder
因为如果文本发生了变化,那么跨度信息也很可能不得不改变.
A SpannableString
具有不可变文本,但其跨度信息是可变的.它是Spannable
接口定义的要求的具体实现.使用SpannableString
时,你的文字并不需要改变,但样式一样.
A SpannableStringBuilder
具有可变文本和跨度信息.它是Spannable
和Editable
接口(以及其他)定义的需求的具体实现.使用SpannableStringBuilder
时需要更新文本及其样式.
A CharSequence
是接口而不是具体类.这意味着它只是为实现它的任何类定义了要遵循的规则列表.上面提到的所有类都实现了它.因此,您可以使用a CharSequence
来概括您拥有的对象类型,以获得最大的灵活性.您可以随时将其向下转换一个String
或SpannableStringBuilder
或任何后,如果您需要.