2012-12-22 45 views
4

添加到spannable中的跨度的优先级会影响TextView中的外观。 当我们添加两个嵌套字符样式到spannable像下面如何反转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); 

添加字符样式的顺序是文本的外观是重要的。 Android通过Spanned.SPAN_PRIORITY标志来处理跨度的优先级。但是当我们使用Html.fromHtml()时,优先级不在我们手中。因此,我可以改变Html.fromHtmel输出的跨度优先级,还是可以从中创建新的spannable并创建新的跨度优先级;

回答

2

我为自己做了一点小小的解决方法。它创建新的Spannable,其中跨度反转。

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; 
} 

用法:

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

这也许是有用的。