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 件のコメント:
コメントを投稿