Android Spanned, SpannedString, Spannable, SpannableString и CharSequence

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

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

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

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

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

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

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

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

SpannedString – это конкретная реализация Spanned interface.

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

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

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

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

  • Выделение результатов поиска

  • Позволяя пользователям вводить расширенный текст , а затем используя Html.toHtml() чтобы сохранить этот форматированный текст в Html.toHtml() HTML

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

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

🙂

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

Интерфейсы, по определению, не имеют «влияния на производительность» – это просто описание API.

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

строка

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

StringBuilder

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

SpannedString

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

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

SpannableString

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

SpannableStringBuilder

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

CharSequence

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