Android Spanned,SpannedString,Spannable,SpannableString和CharSequence

woo*_*oot 86 android textview

Android提供了多种接口所有文字和字符串相关的: Spanned,SpannedString,Spannable,SpannableStringCharSequence.

我已经在各种场景中使用了上述所有内容,通常是在使用Html.fromHtml()内部显示可链接文本之后TextView,以便为其应用一些样式.

我试图从Android的官方文档中了解这些接口的用途/用法并且因为它很混乱而失败了.这些接口的目的是什么?在哪些情况下使用它们最常见?在哪些情况下最好避免使用它们?使用其中任何一个时,是否有任何明显的性能影响?

如果有人能提供一个体面的解释,我将不胜感激.

Com*_*are 143

这些接口的目的是什么?

来自yuml.me/edit/5f8da6cb的图表 CharSequence是表示字符序列的标准Java接口.String是最常用的具体实现CharSequence,其次是StringBuilder.

Spanned是一个CharSequence"spans",表示格式应用于文本的某些部分,这些部分不能修改.

Spannable是一个Spanned,添加了修改跨度的能力(添加或删除格式),但修改文本本身.

SpannedStringSpanned接口的具体实现.

SpannableStringSpannable接口的具体实现.

在哪些情况下使用它们最常见?

当存在返回一个的方法(例如,getText()在a上EditText)或者存在将一个作为参数的方法时(例如,setText()在a上TextView). 来自yuml.me/edit/35c8f39f的图表

您引用使用情况Html.fromHtml()也许是最常见的传统Android开发,作为TextView一个Spanned在重量上要轻得多比是WebView.但是,还有其他用例,例如:

在哪些情况下最好避免使用它们?

它们在对抗秃头,除雪,热泵修复,制作蛋奶酥等方面非常糟糕.

:-)

使用其中任何一个时,是否有任何明显的性能影响?

根据定义,接口没有"性能影响" - 它们仅仅是API的描述.

我不知道这SpannableStringSpannedString任何特定操作都要慢得多.然而,SpannableStringBuilder(它允许在除了格式化文本跨度操纵文本)可能比慢一点SpannableStringSpannedString用于各种事情.但是,性能差异是否足以影响将取决于使用情况.

  • @Pacerier:我不确定你指的是这个答案的哪一部分.例如,本答案中描述的类层次结构肯定来自文档,特别是JavaDocs.相反,这些用于对抗秃头的缺乏实用性来自个人观察. (10认同)
  • 由于官方文档是沉默的,您是如何从中获取这些信息的?手动源浏览硬核方式? (4认同)

Sur*_*gch 34

A String是不可变的(即文本不能改变).它也没有与之相关的任何跨度.(跨度是文本的范围,包括颜色,突出显示,斜体,链接等样式信息.)因此,您可以使用String何时不需要更改文本,也不需要任何样式.

StringBuilder的

A StringBuilder具有可变文本,因此您可以在不创建新对象的情况下对其进行修改.但是,它没有任何跨度信息.这只是纯文本.因此,StringBuilder当您需要更改文本时使用a ,但您不关心它的样式.

SpannedString

A SpannedString具有不可变文本(如a String)和不可变跨度信息.它是Spanned接口定义的要求的具体实现.SpannedString当文本具有样式时使用a ,但在创建文本或样式后不需要更改它.

注意:没有这样的东西,SpannedStringBuilder因为如果文本发生了变化,那么跨度信息也很可能不得不改变.

SpannableString

A SpannableString具有不可变文本,但其跨度信息是可变的.它是Spannable接口定义的要求的具体实现.使用SpannableString时,你的文字并不需要改变,但样式一样.

SpannableStringBuilder

A SpannableStringBuilder具有可变文本和跨度信息.它是SpannableEditable接口(以及其他)定义的需求的具体实现.使用SpannableStringBuilder时需要更新文本及其样式.

为CharSequence

A CharSequence是接口而不是具体类.这意味着它只是为实现它的任何类定义了要遵循的规则列表.上面提到的所有类都实现了它.因此,您可以使用a CharSequence来概括您拥有的对象类型,以获得最大的灵活性.您可以随时将其向下转换一个StringSpannableStringBuilder或任何后,如果您需要.

  • 非常感谢您介绍您的回答,非常容易阅读和理解,谢谢 (2认同)