如何反转 SpannableString 中跨度的优先级

Abo*_*ade 6 html android

添加到 spannable 的 span 的优先级会影响它在 TextView 中的外观。当我们向 spannable 添加两个嵌套的字符样式时,如下所示

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);
Run Code Online (Sandbox Code Playgroud)

添加字符样式的顺序对于文本的外观很重要。Android 通过 Spanned.SPAN_PRIORITY 标志提供了一种处理 span 优先级的方法。但是当我们使用 Html.fromHtml() 时,优先级并不在我们手中。那么我可以更改 Html.fromHtmel 输出的跨度优先级吗,或者我可以从中创建新的跨度并创建新的跨度优先级吗?

小智 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;
}
Run Code Online (Sandbox Code Playgroud)

用法:

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

也许这会有用。