Какова цель этих интерфейсов?
CharSequence
- это стандартный интерфейс Java, представляющий последовательность символов. String
является наиболее часто используемой конкретной реализацией CharSequence
, за которой следует StringBuilder
.
Spanned
- это CharSequence
с «промежутками», указывающими на форматирование, применяемое к частям текста, где эти промежутки не могут быть изменены.
Spannable
- это Spanned
добавление возможности изменять промежутки (для добавления или удаления форматирования), но не для изменения самого текста.
SpannedString
это конкретная реализация Spanned
интерфейса.
SpannableString
это конкретная реализация Spannable
интерфейса.
в каких сценариях они чаще всего используются?
Когда есть метод, который возвращает один (например, getText()
в a EditText
), или когда есть метод, который принимает его в качестве параметра (например, setText()
в a TextView
).
Упомянутый вами случай использования Html.fromHtml()
, пожалуй, наиболее распространен в традиционной разработке для Android, поскольку TextView
с a Spanned
намного легче, чем с WebView
. Однако есть и другие варианты использования, например:
В каких случаях лучше избегать их использования?
Они особенно ужасны при борьбе с облысением, уборкой снега, ремонтом тепловых насосов, приготовлением суфле и т. Д.
:-)
Есть ли какие-либо очевидные влияния на производительность при использовании любого из них?
Интерфейсы по определению не оказывают «влияния на производительность» - они просто описание API.
Я не знаю, что SpannableString
это значительно медленнее, чем SpannedString
при любой конкретной операции. Однако SpannableStringBuilder
(что позволяет манипулировать текстом в дополнение к диапазонам, которые форматируют этот текст) вполне может быть немного медленнее, чем SpannableString
или SpannedString
для различных вещей. Однако будет ли разница в производительности иметь значение, будет зависеть от использования.
spannableString
нормальной, а не нормальной ... потому что я сталкиваюсь с огромной задержкой,setText(my_string)
когдаmy_string
в ней есть смайлы (например, в watsapp) по сравнению с обычной строкой. . (в котором есть только простой текст), пожалуйста, пролейте свет ... почему-то я считал, что смайлы - это не что иное, как текст (unicode)ImageSpan
что, в свою очередь, требуетSpannableString
.Строка
A
String
неизменяемо (т.е. текст не может измениться). Он также не имеет связанных с ним промежутков. (Промежутки - это диапазоны по тексту, которые включают информацию о стилях, такую как цвет, выделение, курсив, ссылки и т. Д.). Таким образом, вы можете использовать,String
когда ваш текст не нужно изменять и не требует стилизации.StringBuilder
A
StringBuilder
имеет изменяемый текст, поэтому вы можете изменить его, не создавая новый объект. Однако у него нет никакой информации о диапазоне. Это просто текст. Поэтому используйте,StringBuilder
когда вам нужно изменить текст, но вам не нужно его стилизовать.SpannedString
A
SpannedString
имеет неизменяемый текст (например, aString
) и неизменяемую информацию диапазона. Это конкретная реализация требований, определенныхSpanned
интерфейсом. Используйте,SpannedString
если у вашего текста есть стиль, но вам не нужно изменять ни текст, ни стиль после его создания.Примечание. Не существует такой вещи, как a,
SpannedStringBuilder
потому что, если текст изменится, вероятно, также придется изменить информацию о диапазоне.SpannableString
A
SpannableString
имеет неизменяемый текст, но его информация о диапазоне может изменяться. Это конкретная реализация требований, определенныхSpannable
интерфейсом. Используйте,SpannableString
когда ваш текст не нужно изменять, но стиль нужно.SpannableStringBuilder
A
SpannableStringBuilder
имеет изменяемый текст и информацию о диапазоне. Это реализация бетона требований , определяемыхSpannable
иEditable
интерфейсов ( в том числе). Используйте,SpannableStringBuilder
если вам нужно обновить текст и его стиль.CharSequence
A
CharSequence
- это интерфейс, а не конкретный класс. Это означает, что он просто определяет список правил, которым нужно следовать для любого класса, который его реализует. И все упомянутые выше классы реализуют это. Таким образом, вы можете использовать,CharSequence
когда хотите обобщить тип объекта, который у вас есть, для максимальной гибкости. Вы всегда можете понизить его доString
илиSpannableStringBuilder
или чего-то еще, если вам нужно.источник