Android提取字符串中的特殊字符(以手机号为例)并修改样式和添加点击事件
首先上代码(效果图在最下方):
//找到你要赋值的那个控件TextView tv_phone = findViewById(R.id.tv_phone);//先定义一串字符串(包含手机号和座机号)String str = "电话是15800000000和0754-84571539";//新建列表用来存储提取到的手机号和座机号List<String> phones = new ArrayList<>();//如果提取到的手机号不为空则加入列表List<String> cellphone = checkCellphone(str);if (cellphone != null && cellphone.size() > 0) {phones.addAll(cellphone);}//如果提取到的座机号不为空则加入列表List<String> telephone = checkTelephone(str);if (telephone != null && telephone.size() > 0) {phones.addAll(telephone);}//对字符串中的手机号添加下划线和点击事件SpannableString spannableString = addClickToString(str, phones);tv_phone.setText(spannableString);//tv_phone.setMovementMethod(LinkMovementMethod.getInstance());//下面是对前面几个函数方法的实现/*** 查询符合的手机号码* @param str*/public static List<String> checkCellphone(String str) {// 将给定的正则表达式编译到模式中Pattern pattern = Pattern.compile("(13[0-9]|14[579]|15[0-3,5-9]|16[6]|17[0135678]|18[0-9]|19[89])\\d{8}");// 创建匹配给定输入与此模式的匹配器。Matcher matcher = pattern.matcher(str);// 创建列表用来存储提取的手机号码List<String> list = new ArrayList<>();//查找字符串中是否有符合的子字符串while (matcher.find()) {//查找到符合的即添加到列表中list.add(matcher.group());}return list;}/*** 查询符合的固定电话* @param str*/public static List<String> checkTelephone(String str) {// 将给定的正则表达式编译到模式中Pattern pattern = Pattern.compile("(0\\d{2}-\\d{8}(-\\d{1,4})?)|(0\\d{3}-\\d{7,8}(-\\d{1,4})?)");// 创建匹配给定输入与此模式的匹配器。Matcher matcher = pattern.matcher(str);// 创建列表用来存储提取的手机号码List<String> list = new ArrayList<>();//查找字符串中是否有符合的子字符串while (matcher.find()) {//查找到符合的即添加到列表中list.add(matcher.group());}return list;}/*** 对字符串中的号码添加点击事件** @param str: 要处理的字符串* @param phones: 号码列表*/private SpannableString addClickToString(String str, List<String> phones) {SpannableString spannableString = new SpannableString(str);for (int i = 0; i < phones.size(); i++) {String phone = phones.get(i);spannableString.setSpan(new Clickable(new View.OnClickListener() {@Overridepublic void onClick(View view) {Intent intent = new Intent(Intent.ACTION_DIAL, Uri.parse("tel:" + phone.replaceAll("-", "")));context.startActivity(intent);}}),str.indexOf(phones.get(i)), //定位该字符串在整个字符串中第一次出现的位置str.indexOf(phones.get(i)) + phones.get(i).length(), //该字符串在整个字符串中结束的位置Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);}return spannableString;}class Clickable extends ClickableSpan {private final View.OnClickListener mListener;public Clickable(View.OnClickListener listener) {mListener = listener;}/*** 重写父类点击事件* @param view*/@Overridepublic void onClick(@NonNull View view) {mListener.onClick(view);}@Overridepublic void updateDrawState(@NonNull TextPaint ds) {super.updateDrawState(ds);ds.setUnderlineText(true); //true显示下划线,false下划线不显示ds.setColor(context.getResources().getColor(R.color.blue)); //设置字体颜色}}
前面的特殊字段不一定要是电话号码,可以根据自己的需要进行调整,然后此处的点击事件是实现电话号码的跳转,用户也可以根据自己的真实需求进行修改。
相关的用法和作用里面的注释也写的很清楚了。
最后的实现图如下:
Android提取字符串中的特殊字符(以手机号为例)并修改样式和添加点击事件相关推荐
- java 正则 提取数字_java使用正则提取字符串中的数字(例如提取短信中的验证码)详解...
使用java正则可以很方便的从字符串中提取符合条件的内容. 1.提取字符串中所有的手机号: private void getPhoneNum(String smsBody) { Pattern pat ...
- android 短信 字符 执行,Android短信中的特殊字符
我已经观察了这个问题多年,现在不知道它来自哪里.我担心这个bug在2011年的新版Android中仍然可以观察到,并且我希望如果不解决它,我终于可以帮助我完全理解它.Android短信中的特殊字符 让 ...
- python 正则之提取字符串中的汉字,数字,字母
python 正则之提取字符串中的汉字,数字,字母 #\d 匹配一个数字字符.等价于 [0-9] #\D 匹配一个非数字字符.等价于 [^0-9]#过滤字符串中的英文与符号,保留汉字 import r ...
- 【Java】不需要正则表达式,提取字符串中的所有汉字、数字、字母
功能 提取字符串中的所有汉字.数字.字母 测试用例 待提取的字符串:Th<><?isI":sa--S??/t+-/ring,这? ???~!===是!$#@%^&一 ...
- linux 取出字符中数字,使用awk提取字符串中的数字或字母
1.提取字符串中的数字$ echo 'dsFUs34tg*fs5a%8ar%$#@' |awk -F "" ' { for(i=1;i<=NF;i++) { if ($i ~ ...
- 正则表达式 - 去掉乱码字符/提取字符串中的中文字符/提取字符串中的大小写字母 - Python代码
目录 1.乱码符号种类较少,用replace() 2.乱码字符种类较多,用re.sub() 3.提取字符串中的中文字符 4.提取字符串中的中文字符和数字 5.提取其他 数据清洗的时候一大烦恼就是数据中 ...
- c语言十六进制字符串转整数,C语言-提取字符串中的十六进制数字并转换为一个十进制整数输出...
问题描述:提取字符串中的十六进制数字并转换为一个十进制整数输出 源代码: /*十六进制转换成十进制*/ #include int main(void) { int i,k; char hexad[80 ...
- [转载] java提取字符串中的字母数字
参考链接: 使用Regex检查字符串在Java中是否仅包含字母 String str = "adsf adS DFASFSADF阿德斯防守对方asdfsadf37<?:?@%#¥ ...
- awk 内嵌正则 提取字符串_使用awk提取字符串中的数字或字母
1.提取字符串中的数字 $ echo 'dsFUs34tg*fs5a%8ar%$#@' |awk -F "" ' { for(i=1;i<=NF;i++) { if ($i ...
最新文章
- 3篇量子计算里程碑论文同登Nature封面:保真度超99%,达到实用化水平
- linux monitor模式,ubuntu14.04 安装linux-802.11n csitool Monitor模式
- 044_定义类或对象
- jvm执行引擎全解,java解释器即时编译器,全都讲明白
- docker 每次都得source /etc/profile以及如何查看Docker容器环境变量、向容器传递环境变量
- python怎样打开加密的文件_如何用Python 加密文件
- Eclipse3.7 Indigo 字体设置为Courier New
- 指针选择排序法,10个整数从小到大排序
- Atitit.eclipse git使用
- jmeter 控制偏离_Jmeter(二十) - 从入门到精通 - JMeter监听器 -下篇(详解教程)
- xshell和xftp免费版下载地址
- Modbus协议的PLC、智能仪表数据采集至SQL数据库,实现双向通讯
- 清华教授!亲手教你JavaScript 在线解压 ZIP 文件,实战理论全都有
- html插入视频快捷键代码,pr添加关键帧的快捷键是什么?
- html常用代码大全
- 部分国内外遥感与GIS杂志(小百合)
- SBUS协议(20200210)
- 宝剑配英雄,玫瑰赠伊人!(祝全天下静姝妇女节快乐!)
- Spring Boot 实现接口幂等性的 4 种方案作者:小小怪下士
- java8新特性之Stream流