105

Android 提供了各种与文本和字符串相关的界面 :SpannedSpannedStringSpannable和.SpannableStringCharSequence

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

我试图从 Android 的官方文档中了解这些接口的用途/用法,但失败了,因为它非常令人困惑。这些接口的目的是什么?在哪些情况下最常使用它们?在哪些情况下最好避免使用它们?使用其中任何一种时,是否有任何明显的性能影响需要考虑?

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

4

2 回答 2

163

这些接口的目的是什么?

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

Spanned是一个CharSequence带有“spans”的“spans”,表示应用于文本部分的格式,这些spans不能被修改。

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

SpannedStringSpanned接口的具体实现。

SpannableStringSpannable接口的具体实现。

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

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

您引用的 using 案例Html.fromHtml()可能是传统 Android 开发中最常见的,因为 a TextViewwith aSpanned的重量比 a 轻得多WebView。但是,还有其他用例,例如:

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

他们在对抗秃头、除雪、热泵维修、制作蛋奶酥等方面非常糟糕。

:-)

使用其中任何一种时,是否有任何明显的性能影响需要考虑?

根据定义,接口没有“性能影响”——它们只是对 API 的描述。

我不知道这SpannableStringSpannedString任何特定操作都要慢得多。但是,SpannableStringBuilder(除了格式化文本的跨度之外,它还允许操作文本)可能会比各种事情慢SpannableString一点SpannedString。不过,性能差异是否足够重要将取决于使用情况。

于 2013-07-09T11:41:23.370 回答
53

细绳

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

字符串生成器

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

跨接字符串

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

注意:没有 a 这样的东西,SpannedStringBuilder因为如果文本更改,那么跨度信息也很可能必须更改。

可跨字符串

ASpannableString具有不可变的文本,但其跨度信息是可变的。它是Spannable接口定义的需求的具体实现。SpannableString当您的文本不需要更改但样式需要更改时,请使用 a 。

SpannableStringBuilder

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

字符序列

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

于 2017-01-30T11:43:56.143 回答