在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();
//獲取匹配的字符串