Android Spanned, SpannedString, Spannable, SpannableString и CharSequence
Android предлагает множество интерфейсов, связанных с текстом и строками:
Spanned,SpannedString,Spannable,SpannableString и CharSequence.
я использовал все вышеперечисленное в различных сценариях обычно после использования Html.fromHtml() для отображения связываемого текста внутри TextView для того, чтобы применить стиль к нему.
Я попытался понять цель / использование этих интерфейсов из официальной документации Android и потерпел неудачу, поскольку это довольно запутанным..
Какова цель этих интерфейсов? в каких сценариях их чаще всего используют? В каких случаях лучше избегать их использования? Существуют ли какие-либо очевидные последствия для производительности, которые следует учитывать при использовании любого из них?
если бы кто-нибудь мог дать достойное объяснение, это было бы очень ценно.
2 ответов:
какова цель этих интерфейсов?
![]()
CharSequence- Это стандартный интерфейс Java, представляющий последовательность символов.Stringявляется наиболее часто используемой конкретной реализациейCharSequence, следовал поStringBuilder.
SpannedэтоCharSequenceс "промежутками", указывающими форматирование для применения к частям текста, где эти промежутки не могут быть изменены.
SpannableэтоSpanned, добавив в возможность изменять пяди (добавлять или удалять форматирование), но не для изменения самого текста.
SpannedString- это конкретная реализацияSpannedинтерфейс.
SpannableString- это конкретная реализацияSpannableинтерфейс.в каких сценариях чаще всего их используют?
когда есть метод, который возвращает одно (например,
getText()наEditText) или когда есть метод, который принимает один в качестве параметра (например,setText()наTextView).ваш пример, используя
Html.fromHtml()является, пожалуй, наиболее распространенным в обычной разработке Android, какTextViewСSpannedгораздо легче по весу, чемWebView. Однако существуют и другие варианты использования, такие как:
позволяет пользователям ввести в богатых текст, затем через
Html.toHtml()чтобы сохранить этот форматированный текст в HTML-версиив каких случаях лучше избегать их использования?
они особенно ужасны в борьбе с облысением, уборке снега, ремонте теплового насоса, приготовлении суфле и т. д.
: -)
есть ли какие-либо очевидные последствия для производительности, которые следует учитывать при использовании любого из них?
интерфейсы, по определению, не имеют "влияния на производительность" - они просто описание 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