2012-12-22 1 views
4

La priorité des segments ajoutés à un effet spannable lors de son apparition dans un TextView. Lorsque nous ajoutons deux style de caractère imbriqué à un spannable comme ci-dessousComment inverser la priorité des segments dans une SpannableString

SpannableStringBuilder sp = new SpannableStringBuilder(); 
String blue = "blue"; 
String red = "red"; 
sp.append(blue); 
sp.append(red); 
sp.append(blue); 
sp.setSpan(new ForegroundColorSpan(Color.RED), blue, 2*blue, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);   
sp.setSpan(new ForegroundColorSpan(Color.BLUE), 0, sp.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); 
((TextView)findViewById(R.id.text_view)).setText(sp); 

L'ordre d'ajouter des styles de caractères est importante sur l'apparence du texte. Android permet de gérer la priorité des étendues grâce au drapeau Spanned.SPAN_PRIORITY. Mais lorsque nous utilisons Html.fromHtml(), les priorités ne sont pas entre nos mains. Donc, puis-je changer les priorités de la sortie de Html.fromHtmel ou puis-je en créer de nouvelles et en faire de nouvelles priorités?

Répondre

2

J'ai fait pour moi-même un peu de contournement. Il crée un nouveau Spannable avec des travées inversées.

final Spannable revertSpans(Spanned stext) { 
    Object[] spans = stext.getSpans(0, stext.length(), Object.class); 
    Spannable ret = Spannable.Factory.getInstance().newSpannable(stext.toString()); 
    if (spans != null && spans.length > 0) { 
     for(int i = spans.length - 1; i >= 0; --i) { 
      ret.setSpan(spans[i], stext.getSpanStart(spans[i]), stext.getSpanEnd(spans[i]), stext.getSpanFlags(spans[i])); 
     } 
    } 

    return ret; 
} 

Utilisation:

TextView tv = (TextView)finViewById(R.id.my_text_view); 
Spanned stext = Html.fromHtml(text, null, myTagHandler); 
Spannable sreverted = revertSpans(stext); 
tv.setText(sreverted); 

Peut-être que ce soit utile.

Questions connexes