4

spannable に追加されたスパンの優先度は、TextView での外観に影響します。以下のように、入れ子になった 2 つの Character Style を 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);

文字スタイルを追加する順序は、テキストの外観にとって重要です。Android は、Spanned.SPAN_PRIORITY フラグを介してスパンの優先度を処理する方法を作成します。しかし、Html.fromHtml() を使用する場合、優先順位は私たちの手にありません。したがって、Html.fromHtmel の出力のスパン優先度を変更できますか、それとも新しいスパン可能にして新しいスパン優先度を作成できますか。

4

1 に答える 1

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

多分これは役に立つでしょう。

于 2013-01-16T12:19:25.897 に答える