Спаннинг Android, SpannedString, Spannable, SpannableString и CharSequence

Android предлагает множество интерфейсов, связанных с текстом и строками:Spanned, SpannedString, Spannable, SpannableString а также CharSequence,

Я использовал все вышеперечисленное в различных сценариях, обычно после использования Html.fromHtml() для отображения связанного текста внутри TextView для того, чтобы применить некоторые стили к нему.

Я попытался понять назначение / использование этих интерфейсов из официальной документации Android и потерпел неудачу, так как это довольно странно. Какова цель этих интерфейсов? в каких случаях чаще всего их используют? В каких случаях лучше избегать их использования? Есть ли какие-либо очевидные воздействия на производительность, которые следует учитывать при использовании любого из них?

Если бы кто-нибудь мог дать достойное объяснение, это было бы очень ценно.

2 ответа

Решение

Какова цель этих интерфейсов?

диаграмма из yuml.me/edit/5f8da6cbCharSequence стандартный интерфейс Java, представляющий последовательность символов String является наиболее часто используемой конкретной реализацией CharSequence, с последующим StringBuilder,

Spanned это CharSequence с "промежутками", указывающими форматирование, чтобы применить к частям текста, где те промежутки не могут быть изменены.

Spannable это Spannedдобавив возможность изменять интервалы (добавлять или удалять форматирование), но не изменять сам текст.

SpannedString это конкретная реализация Spanned интерфейс.

SpannableString это конкретная реализация Spannable интерфейс.

в каких случаях чаще всего их используют?

Когда есть метод, который возвращает один (например, getText() на EditText) или когда есть метод, который принимает один в качестве параметра (например, setText() на TextView). диаграмма из yuml.me/edit/35c8f39f

Ваш приведенный случай использования Html.fromHtml() является, пожалуй, наиболее распространенным в обычной разработке Android, как TextView с Spanned намного легче по весу, чем WebView, Однако есть и другие варианты использования, такие как:

В каких случаях лучше избегать их использования?

Они особенно ужасны в борьбе с облысением, уборкой снега, ремонтом тепловых насосов, приготовлением суфле и т. Д.

:-)

Есть ли какие-либо очевидные воздействия на производительность, которые следует учитывать при использовании любого из них?

Интерфейсы, по определению, не оказывают "влияния на производительность" - они являются просто описанием API.

Я не в курсе что SpannableString значительно медленнее, чем SpannedString в любой конкретной операции. Тем не мение, SpannableStringBuilder (что позволяет манипулировать текстом в дополнение к интервалам, которые форматируют этот текст) может быть немного медленнее, чем SpannableString или же SpannedString для разных вещей. Однако будет ли разница в производительности иметь значение, зависит от использования.

строка

String является неизменным (т. е. текст не может измениться). У этого также нет никаких промежутков, связанных с этим. (Интервалы - это диапазоны текста, включающие информацию о стилях, такую ​​как цвет, выделение, курсив, ссылки и т. Д.). Таким образом, вы можете использовать String когда ваш текст не нуждается в изменении и не нуждается в стилизации.

StringBuilder

StringBuilder имеет изменяемый текст, так что вы можете изменить его, не создавая новый объект. Тем не менее, он не имеет никакой информации о пролете. Это просто текст. Так что используйте StringBuilder когда вам нужно изменить текст, но вы не заботитесь о его оформлении.

SpannedString

SpannedString имеет неизменный текст (например, String) и неизменяемая информация о диапазоне. Это конкретная реализация требований, определенных Spanned интерфейс. Использовать SpannedString когда у вашего текста есть стиль, но вам не нужно изменять ни текст, ни стиль после его создания.

Примечание: нет такой вещи как SpannedStringBuilder потому что если текст изменился, то информация о диапазоне также, скорее всего, должна измениться.

SpannableString

SpannableString имеет неизменный текст, но информация о его диапазоне изменчива. Это конкретная реализация требований, определенных Spannable интерфейс. Использовать SpannableString когда ваш текст не нужно менять, а стиль делает.

SpannableStringBuilder

SpannableStringBuilder имеет как изменяемый текст, так и информацию о span. Это конкретная реализация требований, определенных Spannable а также Editable интерфейсы (среди прочих). Использовать SpannableStringBuilder когда вам нужно будет обновить текст и его стиль.

CharSequence

CharSequence это интерфейс, а не конкретный класс. Это означает, что он просто определяет список правил, которым нужно следовать для любого класса, который его реализует. И все классы, упомянутые выше, реализуют это. Таким образом, вы можете использовать CharSequence когда вы хотите обобщить тип объекта, который у вас есть для максимальной гибкости. Вы всегда можете понизить его до String или же SpannableStringBuilder или что позже, если вам нужно.

Другие вопросы по тегам