1. 程式人生 > >使用SpannableString,ClickableSpan,文字部分可點選

使用SpannableString,ClickableSpan,文字部分可點選

最近4個月都在忙一個專案,最近專案接近尾聲,所有打算趁這個機會稍微做一點總結。

本次總結的功能是實現一段文字,部分文字顏色不同,部分文字有下劃線並且可以點選,主要的思路就是使用SpannableString,自定義一個ClickableSpan。以下就是實現該功能的具體步驟以及相關程式碼。

1.自定義ClickableSpan,通過不同的type去判斷文字顯示的顏色以及下劃線顯示狀況。

  1. publicabstractclass ClickableColorSpan extends ClickableSpan {  
  2.         privateint type;  
  3.         public
     ClickableColorSpan(int type) {  
  4.             // this.str = str;
  5.             this.type = type;  
  6.         }  
  7.         @Override
  8.         publicvoid updateDrawState(TextPaint ds) {  
  9.             if (type == Constants.NOTHING)// 空格情況
  10.             {  
  11.                 // ds.setColor(ds.linkColor);
  12.                 ds.setColor(getActivity().getResources().getColor(  
  13.                         R.color.linkcolor));  
  14.                 ds.setUnderlineText(false);//是否顯示下劃線
  15.             }  
  16.             if (type == Constants.DESCRIPTION)// 解釋或空格選擇
  17.             {  
  18.                 ds.setColor(getActivity().getResources().getColor(  
  19.                         R.color.orange));  
  20.                 ds.setUnderlineText(false
    );  
  21.             }  
  22.             if (type == Constants.NORMAL)// 正常情況
  23.             {  
  24.                 // ds.setColor(ds.linkColor);
  25.                 ds.setColor(getActivity().getResources().getColor(  
  26.                         R.color.linkcolor));  
  27.                 ds.setUnderlineText(true);  
  28.             }  
  29.             if (type == Constants.SELECTED)// 非空格選擇
  30.             {  
  31.                 // ds.setColor(ds.linkColor);
  32.                 ds.setColor(getActivity().getResources().getColor(  
  33.                         R.color.orange));  
  34.                 ds.setUnderlineText(true);  
  35.             }  
  36.         }  
  37.     }  

2.生成富文字
  1. private SpannableString getClickableSpan() {  
  2.         int start = 2;//設定點選範圍
  3.         int end = 4;  
  4.         SpannableString spanableInfo = new SpannableString("hello word");  
  5.         spanableInfo.setSpan(  
  6.                 new ClickableColorSpan(0) {  
  7.                     @Override
  8.                     publicvoid onClick(View v) {  
  9.                     //點選事件
  10.                     }  
  11.                 }, start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);  
  12.         return spanableInfo;  
  13.     }  
3.給控制元件賦值
  1. txtView.setText(getClickableSpan());  
  2. txtView.setMovementMethod(LinkMovementMethod.getInstance());