textsize - Android Spanned, SpannedString, Spannable, SpannableString et CharSequence




textview bold (2)

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

J'ai utilisé tout ce qui précède dans divers scénarios, généralement après avoir utilisé Html.fromHtml() pour afficher du texte TextView dans un TextView afin de lui appliquer un style.

J'ai essayé de comprendre le but / l'utilisation de ces interfaces de la documentation officielle d'Android et ai échoué car il est assez déroutant .. Quel est le but de ces interfaces? Dans quels scénarios est-il le plus commun de les utiliser? Dans quels cas est-il préférable d'éviter de les utiliser? Y a-t-il des impacts de performance évidents à considérer lors de l'utilisation de l'un d'entre eux?

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

https://code.i-harness.com


Quel est le but de ces interfaces?

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 , suivie de StringBuilder .

Spanned est une CharSequence avec des " CharSequence " indiquant le formatage à appliquer aux parties du texte, où ces plages ne peuvent pas être modifiées.

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

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

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

Dans quels scénarios est-il le plus commun de les utiliser?

Quand il y a une méthode qui en retourne une (par exemple, getText() sur un EditText ) ou quand il y a une méthode qui en prend une en tant que paramètre (par exemple, setText() sur un TextView ).

Votre cas cité d'utilisation de Html.fromHtml() est peut-être le plus courant dans le développement Android classique, car un 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 affreux à combattre la calvitie, le déneigement, la réparation de pompe à chaleur, la fabrication d'un soufflé, etc.

:-)

Y a-t-il des impacts de performance évidents à considérer lors de l'utilisation de l'un d'entre eux?

Les interfaces, par définition, n'ont pas «d'impact sur les performances» - elles sont simplement une description d'une API.

Je ne suis pas conscient que SpannableString est significativement plus lent que SpannedString à une opération particulière. Cependant, SpannableStringBuilder (qui permet de manipuler le texte en plus des travées qui SpannableString forme ce texte) peut être un peu plus lent que SpannableString ou SpannedString pour diverses choses. La question de savoir si les différences de performance sont suffisantes ou non dépendra de leur utilisation.


String

Une String est immuable (c'est-à-dire que le texte ne peut pas changer). Il n'a également aucune portée associée. (Les plages sont des plages sur le texte qui incluent des informations de style telles que la couleur, la mise en surbrillance, l'italique, les liens, etc.) Vous pouvez donc utiliser une String lorsque votre texte n'a pas besoin d'être modifié.

StringBuilder

Un StringBuilder a un texte modifiable, vous pouvez donc le modifier sans créer d'objet. Cependant, il n'a aucune information d'envergure. C'est juste du texte brut. Alors utilisez un StringBuilder lorsque vous avez besoin de changer le texte, mais vous ne vous souciez pas de le styliser.

SpannedString

Un SpannedString a un texte immuable (comme une String ) et une information de portée immuable. C'est une implémentation concrète des exigences définies par l'interface Spanned . Utilisez un SpannedString lorsque votre texte a du style, mais vous n'avez pas besoin de modifier le texte ou le style après sa création.

Remarque: Il n'existe pas de SpannedStringBuilder car si le texte était modifié, les informations sur l'étendue devraient également changer.

SpannableString

Une SpannableString a un texte immuable, mais ses informations d'étendue sont modifiables. C'est une implémentation concrète des exigences définies par l'interface Spannable . Utilisez un SpannableString lorsque votre texte n'a pas besoin d'être changé, mais le style le fait.

SpannableStringBuilder

Un SpannableStringBuilder possède à la fois des informations de texte et d'étendue modifiables. C'est une implémentation concrète des exigences définies par les interfaces Spannable et Editable (entre autres). Utilisez un SpannableStringBuilder lorsque vous aurez besoin de mettre à jour le texte et son style.

CharSequence

Une CharSequence est une interface et non une classe concrète. Cela signifie qu'il 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 un CharSequence lorsque vous souhaitez généraliser le type d'objet que vous avez pour une flexibilité maximale. Vous pouvez toujours le SpannableStringBuilder String ou SpannableStringBuilder ou plus tard si vous le souhaitez.





android-textview