Android-TextView進階用法之SpannableStringBuilder
原創-轉載請註明出處。
TextView進階用法
在Android中TextView是我們最熟悉不過的控制元件了,但是它的進階用法你知道多少呢?下面就來聊一聊TextView的進階用法。
1.顯示多種顏色
在做專案中經常會遇到一行字顯示多種顏色的需求。用兩個或多個TextView也可以實現,但這樣比較費事,而且可能還要多一級佈局巢狀。接下來我們需要用到SpannableStringBuilder這個類。
TextView textView = (TextView) findViewById(R.id.textview); String text = "TextView進階用法"; SpannableStringBuilder ssb = new SpannableStringBuilder(text); ssb.setSpan(new ForegroundColorSpan(Color.RED),0,8, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); ssb.setSpan(new ForegroundColorSpan(Color.GREEN),8,text.length(),Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); textView.setText(ssb);
效果如下:

TextView多種顏色
SpannableStringBuilder類實現了CharSequence介面,所以可以直接通過setText()設定值,它更像一個StringBuilder,同時也有append()方法。這樣的話無論要指定多少顏色,都可以通過setSpan()來根據字串的索引長度來解決。
注意:
1.引數start為閉區間,end為開區間。即本例中的0,8實際代表從0~7的長度。 2.int flags:取值有如下四個 Spannable.SPAN_EXCLUSIVE_EXCLUSIVE:前後都不包括,即在指定範圍的前面和後面插入新字元都不會應用新樣式 Spannable.SPAN_EXCLUSIVE_INCLUSIVE:前面不包括,後面包括。即僅在範圍字元的後面插入新字元時會應用新樣式 Spannable.SPAN_INCLUSIVE_EXCLUSIVE:前面包括,後面不包括。 Spannable.SPAN_INCLUSIVE_INCLUSIVE:前後都包括。 大家可以自己試下取不同flags時的效果,可以用EditText試驗。
2.顯示不同大小
將ForegroundColorSpan改為AbsoluteSizeSpan。
ssb.setSpan(new AbsoluteSizeSpan(80),0,8,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
3.刪除線(StrikethroughSpan)
ssb.setSpan(new StrikethroughSpan(),0,8,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
4.下劃線(UnderlineSpan)
ssb.setSpan(new UnderlineSpan(),0,8,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
5.加粗斜體(StyleSpan)
粗體: ssb.setSpan(new StyleSpan(Typeface.BOLD),0,8,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); 斜體: ssb.setSpan(new StyleSpan(Typeface.ITALIC),0,8,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
6.設定點選事件
ssb.setSpan(new ClickableSpan() { @Override public void onClick(View widget) { Toast.makeText(getApplicationContext(),"被點選了",Toast.LENGTH_SHORT).show(); } },0,8,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); //須呼叫此方法,不然點選無效 textView.setMovementMethod(LinkMovementMethod.getInstance());
最終效果如下:

TextView多種顏色
當然,如果你想及設定點選又設定顏色或下劃線的話,ClickableSpan也提供了一個回撥方法來設定顏色下劃線等屬性。
@Override public void updateDrawState(TextPaint ds) { ds.setColor(Color.RED); ds.setUnderlineText(true); }
附上完整程式碼
TextView textView = (TextView) findViewById(R.id.textview); String text = "TextView進階用法"; SpannableStringBuilder ssb = new SpannableStringBuilder(text); ssb.setSpan(new ForegroundColorSpan(Color.RED),0,8, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); ssb.setSpan(new ForegroundColorSpan(Color.GREEN),8,text.length(),Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); ssb.setSpan(new AbsoluteSizeSpan(80),0,8,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); ssb.setSpan(new StrikethroughSpan(),0,8,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); ssb.setSpan(new UnderlineSpan(),0,8,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); ssb.setSpan(new StyleSpan(Typeface.BOLD),0,8,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); ssb.setSpan(new StyleSpan(Typeface.ITALIC),0,8,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); ssb.setSpan(new ClickableSpan() { @Override public void onClick(View widget) { Toast.makeText(getApplicationContext(),"被點選了",Toast.LENGTH_SHORT).show(); } @Override public void updateDrawState(TextPaint ds) { ds.setColor(Color.RED); ds.setUnderlineText(true); } },0,8,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); //須呼叫此方法,不然點選無效 textView.setMovementMethod(LinkMovementMethod.getInstance()); textView.setText(ssb);
這樣就不用擔心一段話要寫多個TextView的問題了。一個TextView統統搞定!