聊天的时候使用TextView拦截超文本连接并替换
来源:互联网 发布:ubuntu 14.04 jdk1.6 编辑:程序博客网 时间:2024/04/29 07:24
做视频聊天的时候,有时候我们要处理超链接文本,当我们从服务端读取的时候,就要进行过滤,并替换处理,比如替换成网页连接、网页失效等等;过滤方法如下代码:
/** * 拦截超链接文本 */ private void interceptHyperLink(TextView tv) { //代码设置识别全部链接类型 tv.setAutoLinkMask(Linkify.ALL); //自己设置几个链接 ,随便弄 StringBuilder sb = new StringBuilder(); sb.append(TextUtils.concat("CSDN:blog.csdn.net/eyishion?viewmode=contents", "\n")); sb.append(TextUtils.concat("邮箱:346419807@qq.com", "\n")); sb.append(TextUtils.concat("手机号码:10086")); tv.setText(sb); //设置这个点击会有效果 ,TextView设置这个下面tv.getText()不会报异常!EditText无所谓 tv.setMovementMethod(LinkMovementMethod.getInstance()); Spannable span = (Spannable) tv.getText(); int end = span.length(); //借助Spannable来获取URLSpan数组然后可以通过遍历获取所有的url地址 URLSpan[] urlSpans = span.getSpans(0, end, URLSpan.class); if (urlSpans == null || urlSpans.length == 0) { return; } //此处使用这个可以设置文本的效果(这里我们自定义点击跳转效果) //我们使用了可变文本的SpannableStringBuilder SpannableStringBuilder ssb = new SpannableStringBuilder(span); //这里遍历获取地址 for (URLSpan urlSpan : urlSpans) { String url = urlSpan.getURL(); if (url.startsWith("http://")) {//Http替换 ssb.replace(ssb.getSpanStart(urlSpan), ssb.getSpanEnd(urlSpan), "liverpool"); //设置自定义的点击效果 CustomURLSpan custom = new CustomURLSpan(url); ssb.setSpan(custom, ssb.getSpanStart(urlSpan), ssb.getSpanEnd(urlSpan), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); } if (url.startsWith("mailto:")) {//email替换 ssb.replace(ssb.getSpanStart(urlSpan), ssb.getSpanEnd(urlSpan), "邮箱"); CustomURLSpan custom = new CustomURLSpan(url); ssb.setSpan(custom, ssb.getSpanStart(urlSpan), ssb.getSpanEnd(urlSpan), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); } if (url.startsWith("tel:")) {//tel替换 ssb.replace(ssb.getSpanStart(urlSpan), ssb.getSpanEnd(urlSpan), "电话号码"); CustomURLSpan custom = new CustomURLSpan(url); ssb.setSpan(custom, ssb.getSpanStart(urlSpan), ssb.getSpanEnd(urlSpan), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); } } tv.setText(ssb); //setHighlightColor(int color)用于设置选中文字背景色高亮显示,这里设置为透明 tv.setHighlightColor(getResources().getColor(android.R.color.transparent)); } /** * 自定义ClickableSpan */ public class CustomURLSpan extends ClickableSpan { public String url; public CustomURLSpan(String url) { this.url = url; } @Override public void onClick(View widget) { //这里实现自己想要的点击效果 Toast.makeText(SpannableUrlLinkActivity.this, url, Toast.LENGTH_SHORT).show(); } @Override public void updateDrawState(TextPaint ds) { ds.setUnderlineText(false); ds.setColor(Color.GREEN); } }
顺便学习了一下SpannableStringBuilder的用法:
/** * SpannableStringBuilder基本使用 */ private void setText(TextView tv) { SpannableStringBuilder ssb = new SpannableStringBuilder(); /**设置背景色 BackgroundColorSpan*/ String s1 = "足协新政向左,亚冠前景向淡\n"; ssb.append(s1); BackgroundColorSpan bgColorSpan = new BackgroundColorSpan(Color.parseColor("#f0660e")); ssb.setSpan(bgColorSpan, ssb.length() - s1.length(), ssb.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); /**设置前景色 ForegroundColorSpan*/ String s2 = "龙骑兵”怎么啦?\n"; ssb.append(s2); ForegroundColorSpan fgColorSpan = new ForegroundColorSpan(Color.parseColor("#0f660f")); ssb.setSpan(fgColorSpan, ssb.length() - s2.length(), ssb.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); /**设置删除线效果 StrikethroughSpan*/ String s3 = "亚冠高开,中超继续高走?\n"; ssb.append(s3); StrikethroughSpan strikeSpan = new StrikethroughSpan(); ssb.setSpan(strikeSpan, ssb.length() - s3.length(), ssb.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); /**设置下划线效果 UnderlineSpan*/ String s4 = "中超首秀,足协新政雷倒了谁?\n"; ssb.append(s4); UnderlineSpan ulSpan = new UnderlineSpan(); ssb.setSpan(ulSpan, ssb.length() - s4.length(), ssb.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); /**设置粗体、斜体效果 StyleSpan*/ String s5 = "亚冠抗日在即,恒苏须猛醒\n"; ssb.append(s5); StyleSpan styleSpan = new StyleSpan(Typeface.BOLD_ITALIC); ssb.setSpan(styleSpan, ssb.length() - s5.length(), ssb.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); /**设置字体、大小、样式、颜色 TextAppearanceSpan*/ String s6 = "一战正名,上港比肩2013版恒大?\n"; ssb.append(s6); TextAppearanceSpan textAppearanceSpan = new TextAppearanceSpan(this, android.R.style.TextAppearance); ssb.setSpan(textAppearanceSpan, ssb.length() - s6.length(), ssb.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); /**文本替换成图片 ImageSpan*/ String s7 = "保卫长沙?-从长沙开始进攻!\n"; ssb.append(s7); ImageSpan is1 = new ImageSpan(this, R.mipmap.emoji_1); ImageSpan is2 = new ImageSpan(this, R.mipmap.emoji_2); ImageSpan is3 = new ImageSpan(this, R.mipmap.emoji_3); //替换 ? ssb.setSpan(is1, ssb.length() - s7.length() + 4, ssb.length() - s7.length() + 5, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); //替换 - ssb.setSpan(is2, ssb.length() - s7.length() + 5, ssb.length() - s7.length() + 6, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); //替换 ! ssb.setSpan(is3, ssb.length() - 2, ssb.length() - 1, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); /**使用超链接标记文本 URLSpan*/ String s8 = "里皮,将神奇进行到德黑兰"; ssb.append(s8); URLSpan urlSpan = new URLSpan("http://blog.csdn.net/eyishion?viewmode=contents") { @Override public void updateDrawState(TextPaint ds) { super.updateDrawState(ds); ds.setColor(ds.linkColor); ds.setUnderlineText(false); } }; ssb.setSpan(urlSpan, ssb.length() - s8.length(), ssb.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); tv.setText(ssb); }
0 0
- 聊天的时候使用TextView拦截超文本连接并替换
- drupal6中使用drupal_html_to_text方法过滤替换html超文本代码
- TextView中打开超文本链接
- express使用webpack热加载替换时候遇到的坑
- Android中WebView中拦截所有请求并替换URL(支持AJAX的post请求类型)
- 使用socket 聊天对话的时候需要注意的如果有不对欢迎指正
- Android中WebView中拦截所有请求并替换URL
- HTML5基于Tomcat 7.0实现WebSocket连接并实现简单的实时聊天
- 使用C++编写的查找字符子串并替换
- Android中在TextView里面替换掉带html标签和不带标签的url,并支持点击
- TextView中使用一个字符串替换字符串str中start到end的子字符串
- TextView中使用一个字符串替换字符串str中start到end的子字符串
- TextView+View渐变,viewpager滑动的时候
- python里使用正则表达式来替换匹配成功的组并限定替换的次数
- python里使用正则表达式来替换匹配成功的组并输出替换的次数
- RunTime-消息的拦截与替换
- 使用WebServices时候遇到“基础连接以关闭”的问题
- 在使用逗号连接的时候,切割最后一个逗号
- ECMAScript中变量的解构赋值
- 深度理解cnn 网络
- 约素
- DataTables 修改head排序样式
- 基于MM、STP、ECN、MTF的外汇平台模式深度分析
- 聊天的时候使用TextView拦截超文本连接并替换
- 算法课第5周第1题——452. Minimum Number of Arrows to Burst Balloons
- JAVA——抽象类和接口
- SQL Plus常用命令
- DS导入导出命令详解
- Hadoop1.1.2伪分布式安装笔记
- CentOS安装tomcat
- UE删除空行
- MongoDB的安装