2012年3月13日火曜日

SPAN_EXCLUSIVE_EXCLUSIVE

SPAN_EXCLUSIVE_EXCLUSIVE

SpannableStringBuilder#setSpanメソッドの第四番目の引数の意味が不明だったため、調べました。

Corgiさんのspanの適用範囲の設定に解答がありました。
そこに書かれている内容を検証するプログラムを作りました。

public class TextViewActivity extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        String s;
        SpannableStringBuilder ssb;
        BackgroundColorSpan spanBCEE, spanBCEI, spanBCIE, spanBCII, spanBCNothing;
        TextView tv;
        
        s = getString(R.string.hello);
        ssb = new SpannableStringBuilder();
        ssb.append(s);
        spanBCEE = new BackgroundColorSpan(0xff880000);
        spanBCEI = new BackgroundColorSpan(0xff880000);
        spanBCIE = new BackgroundColorSpan(0xff880000);
        spanBCII = new BackgroundColorSpan(0xff880000);
        spanBCNothing = new BackgroundColorSpan(0xff880000);
        ssb.setSpan(spanBCEE, 2, 4, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
        ssb.setSpan(spanBCEI, 7, 9, Spannable.SPAN_EXCLUSIVE_INCLUSIVE);
        ssb.setSpan(spanBCIE, 12, 14, Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
        ssb.setSpan(spanBCII, 17, 19, Spannable.SPAN_INCLUSIVE_INCLUSIVE);
        ssb.setSpan(spanBCNothing, 17, 19, 0);
        
        ssb.insert(24, "*");
        ssb.insert(22, "*");
        ssb.insert(19, "*");
        ssb.insert(17, "*");
        ssb.insert(14, "*");
        ssb.insert(12, "*");
        ssb.insert(9, "*");
        ssb.insert(7, "*");
        ssb.insert(4, "*");
        ssb.insert(2, "*");
        
        tv = (TextView)findViewById(R.id.TextView);
        tv.setText(ssb);
    }
}

上記プログラムによって、画面には次のように表示されます。

He*ll*o W*or*ld,* T*ext*Vi*ewA*ct*ivity!

次に、挿入を、範囲の内側に実施した場合の実験をしてみました。挿入部分のcodeは次のとおりです。
        ssb.insert(23, "*");
        ssb.insert(18, "*");
        ssb.insert(13, "*");
        ssb.insert(8, "*");
        ssb.insert(3, "*");
この結果は次のとおりです。

Hel*lo Wo*rld, *TextV*iewAc*tivity!

以上のことから、Corgiさんが説明するように、「spanの適用範囲の直前直後に関する設定」ということが言えます。

挿入をすることによって意味を成すオプションであるため、SpannableStringBuilder#setSpanでは使えますが、SpannableString#setSpanでは意味の無いオプションであるように思えます。

第四番目の引数にゼロを代入した場合、装飾が表示されないため、何か値を代入しておかなければならないということです。

Spannable.SPAN_MARK_MARKは、Spannable.SPAN_INCLUSIVE_EXCLUSIVEと同じConstant Value 17 (0x00000011)です。


Spannable.SPAN_POINT_POINTは、Spannable.SPAN_EXCLUSIVE_INCLUSIVEと同じConstant Value 34 (0x00000022)です。

0 件のコメント:

コメントを投稿