106 votes

Spanned, SpannedString, Spannable, SpannableString et CharSequence d'Android

Android offre une variété d'interfaces toutes liées au texte et aux chaînes de caractères : Spanned , SpannedString , Spannable , SpannableString y CharSequence .

J'ai utilisé tous les éléments ci-dessus dans divers scénarios. généralement après avoir utilisé Html.fromHtml() pour afficher un texte pouvant être lié à l'intérieur d'un TextView afin de lui appliquer un certain style.

J'ai essayé de comprendre l'objectif/utilisation de ces interfaces à partir de la documentation officielle d'Android et j'ai échoué car c'est assez confus Quel est le but de ces interfaces ? Dans quels scénarios est-il le plus courant de les utiliser ? Dans quels cas est-il préférable d'éviter de les utiliser ? Y a-t-il des impacts évidents sur les performances à prendre en compte lors de l'utilisation de l'une d'entre elles ?

Si quelqu'un pouvait fournir une explication décente, ce serait très apprécié.

167voto

CommonsWare Points 402670

Quel est le but de ces interfaces ?

diagram from yuml.me/edit/5f8da6cb CharSequence est une interface Java standard représentant une séquence de caractères. String est l'implémentation concrète la plus couramment utilisée de CharSequence suivi par StringBuilder .

Spanned est un CharSequence avec des "travées" indiquant le formatage à appliquer à des portions du texte, où ces travées ne peuvent pas être modifiées.

Spannable est un Spanned en ajoutant la possibilité de modifier les travées (pour ajouter ou supprimer le formatage), mais no pour modifier le texte lui-même.

SpannedString est une implémentation concrète de la Spanned interface.

SpannableString est une implémentation concrète de la Spannable interface.

dans quels scénarios est-il le plus courant de les utiliser ?

Lorsqu'il existe une méthode qui en renvoie un (par exemple, getText() sur un EditText ) ou lorsqu'il existe une méthode qui en prend un comme paramètre (par ex, setText() sur un TextView ). diagram from yuml.me/edit/35c8f39f

Le cas que vous avez cité concernant l'utilisation de Html.fromHtml() est peut-être le plus courant dans le développement conventionnel d'Android, car une TextView avec un Spanned est beaucoup plus léger qu'un WebView . Cependant, il existe d'autres cas d'utilisation, tels que :

Dans quels cas est-il préférable d'éviter de les utiliser ?

Ils sont singulièrement mauvais pour combattre la calvitie, déneiger, réparer une pompe à chaleur, faire un soufflé, etc.

-)

L'utilisation de l'une d'entre elles a-t-elle un impact évident sur les performances ?

Les interfaces, par définition, n'ont pas d'"impact sur les performances" -- elles ne sont qu'une description d'une API.

Je ne suis pas au courant que SpannableString est nettement plus lent que SpannedString à une opération particulière. Cependant, SpannableStringBuilder (qui permet de manipuler le texte en plus des espaces qui formatent ce texte) pourrait bien être un peu plus lent que SpannableString o SpannedString pour diverses choses. La différence de performance dépend de l'usage que l'on en fait.

53voto

Suragch Points 197

Chaîne de caractères

A String est immuable (c'est-à-dire que le texte ne peut pas changer). Il n'est pas non plus associé à des espaces. (Les espaces sont des plages au-dessus du texte qui comprennent des informations de style telles que la couleur, la mise en évidence, l'italique, les liens, etc. String lorsque votre texte ne doit pas être modifié et n'a pas besoin d'être stylisé.

StringBuilder

A StringBuilder a un texte mutable, vous pouvez donc le modifier sans créer un nouvel objet. Cependant, il ne contient pas d'informations sur la portée. Il s'agit simplement de texte brut. Utilisez donc un objet StringBuilder lorsque vous devez modifier le texte, mais que vous ne vous souciez pas de le styliser.

Chaîne étendue

A SpannedString a un texte immuable (comme un String ) et des informations immuables sur le span. Il s'agit d'une mise en œuvre concrète des exigences définies par la norme Spanned interface. Utilisez une SpannedString lorsque votre texte a un style mais que vous n'avez pas besoin de modifier ni le texte ni le style après sa création.

Note : Il n'y a rien de tel qu'un SpannedStringBuilder parce que si le texte changeait, les informations relatives à la portée devraient aussi très probablement être modifiées.

Chaine spanable

A SpannableString a un texte immuable, mais ses informations de portée sont mutables. Il s'agit d'une mise en œuvre concrète des exigences définies par la norme Spannable interface. Utilisez une SpannableString lorsque votre texte n'a pas besoin d'être modifié mais que le style l'est.

SpannableStringBuilder

A SpannableStringBuilder possède à la fois du texte mutable et des informations de type span. Il s'agit d'une implémentation concrète des exigences définies par la norme Spannable y Editable (entre autres). Utilisez un SpannableStringBuilder lorsque vous devrez mettre à jour le texte et son style.

CharSequence

A CharSequence est une interface et non une classe concrète. Cela signifie qu'elle définit simplement une liste de règles à suivre pour toute classe qui l'implémente. Et toutes les classes mentionnées ci-dessus l'implémentent. Vous pouvez donc utiliser une CharSequence lorsque vous voulez généraliser le type d'objet que vous avez pour un maximum de flexibilité. Vous pouvez toujours le rabattre sur un String o SpannableStringBuilder ou autre plus tard si vous en avez besoin.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X