通常在使用Html.fromHtml()将可链接文本显示在TextView中并应用一些样式后,我会在各种场景中使用上述所有接口。
我尝试从Android官方文档中理解这些接口的目的和用法,但失败了,因为它很令人困惑。这些接口的目的是什么?在哪些场景下最常用它们?在哪些情况下最好避免使用它们?使用它们时是否有明显的性能影响?
如果有人能提供一个合理的解释,将不胜感激。
CharSequence
是一个标准的 Java 接口,表示一系列字符。 String
是最常用的 CharSequence
具体实现,其次是 StringBuilder
。
Spanned
是一个带有“跨度”的 CharSequence
,指示要应用于文本部分的格式,其中这些跨度不能被修改。
Spannable
是一个 Spanned
,增加了修改跨度(添加或删除格式),但不能修改文本本身的能力。
SpannedString
是 Spanned
接口的一个具体实现。
SpannableString
是 Spannable
接口的一个具体实现。当有一个方法返回一个值时(例如,在EditText
上的getText()
),或者当有一个方法以一个参数作为输入时(例如,在TextView
上的setText()
)。
在传统的Android开发中,你提到的使用Html.fromHtml()
的情况可能是最常见的,因为带有Spanned
的TextView
比WebView
轻。然而,还有其他用例,例如:
在哪些情况下最好避免使用它们?
它们非常不适合用于解决脱发、除雪、热泵维修、制作舒芙蕾等问题。
:-)
在使用它们时是否存在明显的性能影响需要考虑?
接口本质上并没有"性能影响",它们只是API的描述。
我不知道SpannableString
在任何特定操作上是否比SpannedString
慢得多。但是,SpannableStringBuilder
(允许对文本进行操作以及格式化该文本的跨度)在某些方面可能会比SpannableString
或SpannedString
慢一些。但是,性能差异是否足以成为问题将取决于使用情况。
String
是不可变的(即文本无法更改)。它也没有与之关联的任何范围(span)。范围是指跨越文本的区域,包括样式信息(如颜色、高亮、斜体、链接等)。因此,当您的文本不需要更改且不需要任何样式时,可以使用String
。
StringBuilder
具有可变文本,因此您可以在不创建新对象的情况下修改它。但是,它没有任何范围信息。它只是普通文本。因此,在需要更改文本但不关心其样式时,请使用StringBuilder
。
SpannedString
具有不可变文本(就像String
)和不可变范围信息。它是符合Spanned
接口定义的具体实现。当您的文本具有样式但在创建后不需要更改文本或样式时,请使用SpannedString
。
注意:不存在SpannedStringBuilder
,因为如果文本发生更改,则范围信息很可能也会发生更改。
SpannableString
可以通过附加对象到特定部分,添加样式和其他元数据。它具有可变文本和可变范围信息。当您需要同时更改文本和样式时,请使用SpannableString
。
SpannableString
是不可变的文本,但其跨度信息是可变的。它是实现Spannable
接口所定义要求的具体实现。当您的文本不需要更改但样式需要更改时,请使用SpannableString
。
SpannableStringBuilder
既具有可变文本又具有跨度信息。它是实现Spannable
和Editable
接口(以及其他接口)所定义要求的具体实现。当您需要更新文本及其样式时,请使用SpannableStringBuilder
。
CharSequence
是一个接口而不是具体类。这意味着它只定义了任何实现它的类所遵循的一系列规则。上面提到的所有类都实现了它。因此,当您想要将对象类型泛化以获得最大的灵活性时,可以使用CharSequence
。如果需要,您始终可以将其向下转换为String
或SpannableStringBuilder
等类型。
spannableString
而不是普通字符串.. 因为当my_string
中有表情符号(例如watsapp中的表情符号)时,使用setText(my_string)
会出现巨大的延迟,与只有纯文本的普通字符串相比较。 请给予一些指导...我曾经认为表情符号只是文本(Unicode)。 - eRaisedToX