105 votes

Expliquez la signification des balises de Span comme SPAN_EXCLUSIVE_EXCLUSIVE

Quelqu'un peut-il expliquer clairement avec des exemples ce que chacun des drapeaux de span comme SPAN_EXCLUSIVE_EXCLUSIVE et SPAN_MARK_MARK signifie et quand utiliser quels drapeaux ?

Je ne comprends pas la documentation officielle quand elle dit :

Les Spans de type SPAN_EXCLUSIVE_EXCLUSIVE n'augmentent pas pour inclure le texte inséré à leur point de départ ou de fin.

Est-ce que "augmenter pour inclure" fait référence aux modifications apportées après l'insertion des spans ?

Cela signifie-t-il que ces drapeaux n'affectent PAS les Spannables avec un texte immuable ?

264voto

Suragch Points 197

Que signifient les drapeaux

Les parties INCLUSIVE et EXCLUSIVE des drapeaux de la classe Spannable indiquent en réalité si oui ou non le span devrait inclure le texte qui est inséré aux positions de début ou de fin.

Voici un exemple modifié pour illustrer cela.

String myString = "01234";
int start = 1;
int end = 3;
int spanFlag = Spannable.SPAN_INCLUSIVE_INCLUSIVE; // c'est ce qui change

// définir le span
SpannableStringBuilder spannableString = new SpannableStringBuilder(myString);
ForegroundColorSpan foregroundSpan = new ForegroundColorSpan(Color.RED);
spannableString.setSpan(foregroundSpan, start, end, spanFlag);

// insérer le texte une fois que le span a déjà été défini
// (insérer à la deuxième position de début pour ne pas perturber la position de fin)
spannableString.insert(end, "x");
spannableString.insert(start, "x");

textView.setText(spannableString);

Voici les résultats après avoir inséré un x aux positions de fin et de début :

SPAN_INCLUSIVE_INCLUSIVE

description de l'image ici

SPAN_INCLUSIVE_EXCLUSIVE

description de l'image ici

SPAN_EXCLUSIVE_INCLUSIVE

description de l'image ici

SPAN_EXCLUSIVE_EXCLUSIVE

description de l'image ici

Notes

  • Dans le second exemple, j'ai dû utiliser un SpannableStringBuilder car le texte dans un SpannableString est immuable, donc vous ne pouvez pas y insérer de texte. Ainsi, les drapeaux sont généralement sans signification pour un SpannableString. Cependant, on pourrait imaginer une situation dans laquelle les spans d'un SpannableString sont copiés dans un SpannableStringBuilder ou un Editable, et à partir de là les drapeaux auraient une signification.
  • Voir cette réponse pour la différence entre SpannableString, SpannableStringBuilder, Editable, et plus encore.

118voto

CommonsWare Points 402670

Est-ce que "s'étendre pour inclure" fait référence aux modifications apportées après l'insertion des spans?

Oui. Par exemple, supposons que nous ayons ce qui suit:

Le renard rapide a sauté.

Si nous utilisons SPAN_EXCLUSIVE_EXCLUSIVE sur le span en gras, et que nous insérons du texte au milieu du span, il reste en gras:

Le renard brun rapide a sauté.

Cependant, si nous insérons du texte au début ou à la fin du span en gras, le texte inséré n'est pas en gras:

Le très renard rapide a sauté.

Si, en revanche, nous avions utilisé SPAN_INCLUSIVE_EXCLUSIVE, l'insertion de texte au début serait incluse dans le span, et nous aurions:

Le très renard rapide a sauté.

Cela signifie-t-il que ces drapeaux n'affectent PAS les Spannables avec du texte immutable?

Je dirais qu'ils ont une utilisation limitée pour le texte immutable. Principalement, ils seront utilisés avec SpannableStringBuilder ou des éléments qui en utilisent un en interne (par exemple, EditText).

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