Android中的SpannableString以及Pattern/Matcher的使用

在Android中有一個類叫做SpannableString,它具有很強大的替換功能,可以設置各種Span的字符串,比如常用的可以將TextView、EditText等中的文本替換爲相應的圖片、表情等顯示出來。他自身還有很多屬性可以進行相應的設置修改,比較靈活。

這裏介紹他的幾個常用屬性,以及使用方式。

//設置前景色
ForegroundColorSpan(Color.GREEN)
//設置背景色

BackgroundColorSpan(Color.BLACK)
//設置圖片

ImageSpan(context,resId)
//設置刪除線
StrikeThroughSpan
//設置下劃線
UnderlineSpan
//單獨設置字體的大小
AbsoluteSizeSpan(size)
AbsoluteSizeSpan(size,flag) //flag爲true表示 設置的字體大小單位爲sp
//單獨設置字體的樣式
StyleSpan(style)

實例如下:

String string="請輸入替換內容";
//根據String創建一個SpannableString
SpannableString ss=new SpannableString(string);
ss.setSpan(new ForegroundColorSpan(Color.GREEN), 3, 5, SpannableString.SPAN_EXCLUSIVE_EXCLUSIVE);
ss.setSpan(new BackgroundColorSpan(Color.BLACK), 0, 3, SpannableString.SPAN_EXCLUSIVE_EXCLUSIVE);
ss.setSpan(new ImageSpan(this, R.drawable.ue404), 5, 6, SpannableString.SPAN_EXCLUSIVE_EXCLUSIVE);
ss.setSpan(new AbsoluteSizeSpan(20, true), 3, 5, SpannableString.SPAN_EXCLUSIVE_EXCLUSIVE);
et.setError(ss);
return true;


一般我們在多次需要使用該替換功能時,一般我們可以寫一個工具類,在工具類中對該方法進行封裝,使用時直接傳參數調用即可,例如下面即是將TextView中的文本替換爲圖片ImageSpan的封裝

public static SpannableString getSpannableString(String string){
//把形如[emo]ue058這樣的內容替換爲一個IamgeSpan
//ImageSpan中顯示的圖像時R.drawable.ue058
SpannableString ss=new SpannableString(string);
//Pattern  Matcher
Pattern pattern=Pattern.compile("\\[emo\\]ue[a-z0-9]{3}");
Matcher matcher=pattern.matcher(string);
while(matcher.find()){
int startIdx=matcher.start();
int endIdx=matcher.end();
String resId=matcher.group();
int id=MyApp.context.getResources().getIdentifier(resId.substring(5), "drawable", MyApp.context.getPackageName());
ss.setSpan(new ImageSpan(MyApp.context, id), startIdx, endIdx, SpannableString.SPAN_EXCLUSIVE_EXCLUSIVE);
}
return ss;
}

在這裏我們還使用到了Android提供的另外兩個類,Pattern 和 Matcher,這兩個類是Android官方提供給我們進行進行字符串篩選匹配使用的。它兩個是搭配使用的,其中Pattern.compile("\\[emo\\]ue[a-z0-9]{3}")括號中的內容爲正則表達式,對我們需要獲取的字符串進行篩選匹配,這裏是匹配形如[emo]ue058的字符串,matcher常用方法一共就四個,如下:

matcher.find(); //返回true表示匹配成功,false表示無匹配項

matcher.start(); //匹配項的開始位置

matcher.end(); //匹配項的結束位置

matcher.group(); //獲取匹配的字符串

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章