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

来源:互联网 发布:淘宝换ipad电池 编辑:程序博客网 时间:2024/06/03 15:18

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

1 0
原创粉丝点击