Спаннинг Android, 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
для разных вещей. Однако будет ли разница в производительности иметь значение, зависит от использования.
строка
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
или что позже, если вам нужно.