Android Spanned, SpannedString, Spannable, SpannableString и CharSequence



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



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



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



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

364   2  

2 ответов:

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

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

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

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

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

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

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

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

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

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

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

: -)

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

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

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

строка

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

StringBuilder

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

SpannedString

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

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

SpannableString

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

SpannableStringBuilder

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

CharSequence

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

Comments

    Ничего не найдено.