2012-12-22 44 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); 

這也許是有用的。