【问题标题】:How to reverse priority of spans in a SpannableString如何反转 SpannableString 中跨度的优先级
【发布时间】:2012-12-22 04:35:19
【问题描述】:

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

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 输出的跨度优先级,还是可以从中创建新的跨度并制定新的跨度优先级;

【问题讨论】:

    标签: android html


    【解决方案1】:

    我为自己做了一些解决方法。它创建了新的 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);
    

    也许这很有用。

    【讨论】:

      猜你喜欢
      • 2010-11-28
      • 2015-05-31
      • 2011-05-14
      • 1970-01-01
      • 2016-02-05
      • 1970-01-01
      • 1970-01-01
      • 2017-09-02
      相关资源
      最近更新 更多