Android-TextView進階用法之SpannableStringBuilder

原創(chuàng)-轉載請注明出處。

TextView進階用法

在Android中TextView是我們最熟悉不過的控件了,但是它的進階用法你知道多少呢?下面就來聊一聊TextView的進階用法。

1.顯示多種顏色

在做項目中經(jīng)常會遇到一行字顯示多種顏色的需求。用兩個或多個TextView也可以實現(xiàn),但這樣比較費事,而且可能還要多一級布局嵌套。接下來我們需要用到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類實現(xiàn)了CharSequence接口,所以可以直接通過setText()設置值,它更像一個StringBuilder,同時也有append()方法。這樣的話無論要指定多少顏色,都可以通過setSpan()來根據(jù)字符串的索引長度來解決。
注意:

1.參數(shù)start為閉區(qū)間,end為開區(qū)間。即本例中的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統(tǒng)統(tǒng)搞定!

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內容