Spannable.SPAN_COMPOSING sample codeの続編です。
setSpanメソッドの第一引数の値が、第1回目に実行される場合と第2回目に実行される場合とで、同一である場合には、Spannable.SPAN_COMPOSINGの効果はあります。
しかし、別の値になった場合には、Spannable.SPAN_COMPOSINGの効果が無くなり、第1回目の装飾は残ったままになります。
第一引数の値が前回の値と異なる場合には、前回の装飾を消すためにremoveSpanメソッドを使います。
sample codeは次のとおりです。前回のspanをremoveSpanメソッドで削除しているため、setSpanメソッドの第4番目の引数Spannable.SPAN_COMPOSINGはダミー(空間を埋めるためだけを目的とした意味の無い言葉)になります。
public class TextViewSpanRemoveActivity extends Activity
implements
OnClickListener
{
final int iMaxChar = 255;
int iCounter;
Button bu;
TextView tv;
SpannableString ss;
BackgroundColorSpan spanBC;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
int i;
char c = '亜';
StringBuilder sb;
bu = (Button)findViewById(R.id.Button);
bu.setOnClickListener(this);
tv = (TextView)findViewById(R.id.TextView);
//表示する文字列の作成
sb = new StringBuilder();
for(i=0; i<iMaxChar; i++) sb.append(c++);
//装飾の作成
ss = new SpannableString(sb.toString());
spanBC = new BackgroundColorSpan(0xff880000);
//第ゼロ番目の文字に装飾を施す。
iCounter = 0;
ss.setSpan(spanBC, iCounter, iCounter+1, Spannable.SPAN_COMPOSING);
tv.setText(ss);
}
@Override
public void onClick(View v) {
if(v==bu){//クリックした場合
int i, iRed, iBlue;
//もし、removeSpanメソッドを実行しない場合、
//前回の装飾はそのまま残り、かつ次の文字も装飾される。
ss.removeSpan(spanBC);//既に設定されているSpanを消す。
iCounter++;//次の文字に移行する。
if(iCounter>iMaxChar) iCounter = 0;
//適当に色を変える
iRed = iCounter & 0x0f;
iRed = 0x0f - iRed;
iRed <<= 20;
iBlue = iCounter % 16;
iBlue <<= 4;
i = 0xff000000 + iRed + iBlue;
spanBC = new BackgroundColorSpan(i);
ss.setSpan(spanBC, iCounter, iCounter+1, Spannable.SPAN_COMPOSING);
tv.setText(ss);
return;
}
}
}
0 件のコメント:
コメントを投稿