SpannableString对微博内容的处理(超链接、用户名、主题点击跳转)
来源:互联网 发布:黑暗之魂3白色头发数据 编辑:程序博客网 时间:2024/05/21 07:49
实现上面图像的效果,点击超链接跳转到对应链接,点击用户名或主题跳转到其他Activity并把用户名作为参数传递过去。同时实现区分邮箱跟用户的混淆
(如上面lau@qq.com不会被认为有一个用户@qq.com)
SpannableStringDemoActivity.java
package com.lau.spannablestring;import java.util.regex.Matcher;import java.util.regex.Pattern;import android.app.Activity;import android.content.Intent;import android.os.Bundle;import android.text.Spannable;import android.text.SpannableStringBuilder;import android.text.TextPaint;import android.text.method.LinkMovementMethod;import android.text.style.CharacterStyle;import android.text.style.ClickableSpan;import android.text.style.URLSpan;import android.view.View;import android.widget.TextView;public class SpannableStringDemoActivity extends Activity {TextView textView = null;final static String string = "#刘翔# //@李开复: @薛蛮子:@李开复: @李开复:@李开复:@李开复:lau@qq.com " +"http://www.baidu.com/index.php?tn=360se_dg " +"转发// //@新周刊:@李承鹏:@财经网: Email:lau@qq.com又是公安牵头。@李承鹏@李承鹏@李承鹏@李承鹏:随时随刻离不开暴力。"; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); textView = (TextView) findViewById(R.id.textView1); ssb.append(string); findAt(string, 0); findTheme(string, 0); findLink(string, 0); findEmail(string, 0); textView.setText(ssb); textView.setMovementMethod(LinkMovementMethod.getInstance()); }private static final String STR_PATTERN_AT = "@[\\u4e00-\\u9fa5\\w\\-]+";private static final String STR_PATTERN_THEME = "#[^\\#|.]+#";private static final String STR_PATTERN_LINK = "http://[&=?/\\.\\w]+";private static final String STR_PATTERN_EMAIL = "\\w+(\\.\\w+)*@\\w+(\\.\\w+)+";private static final Pattern mPatternAt = Pattern.compile(STR_PATTERN_AT);private static final Pattern mPatternTheme = Pattern.compile(STR_PATTERN_THEME);private static final Pattern mPatternLink = Pattern.compile(STR_PATTERN_LINK);private static final Pattern mPatternEmail = Pattern.compile(STR_PATTERN_EMAIL);private SpannableStringBuilder ssb = new SpannableStringBuilder();private Matcher matcher = null; //从位置pos开始查找@关键字void findAt(String str, int pos) {if(str == null || str.length() == 0) {return;}matcher = mPatternAt.matcher(str);if(matcher.find()) {final String find = matcher.group();final int start = str.indexOf(find) + pos;final int end = start + find.length();MyClickableSpan clickableSpan = new MyClickableSpan(string.substring(start, end));ssb.setSpan(clickableSpan, start, end, Spannable.SPAN_INCLUSIVE_INCLUSIVE);pos = end;findAt(string.substring(end), pos);}}//从位置pos开始查找##关键字void findTheme(String str, int pos) {if(str == null || str.length() == 0) {return;}matcher = mPatternTheme.matcher(str);if(matcher.find()) {final String find = matcher.group();final int start = str.indexOf(find) + pos;final int end = start + find.length();MyClickableSpan clickableSpan = new MyClickableSpan(string.substring(start, end));ssb.setSpan(clickableSpan, start, end, Spannable.SPAN_INCLUSIVE_INCLUSIVE);pos = end;findTheme(string.substring(end), pos);}}//从位置pos开始查找链接关键字void findLink(String str, int pos) {if(str == null || str.length() == 0) {return;}matcher = mPatternLink.matcher(str);if(matcher.find()) {final String find = matcher.group();final int start = str.indexOf(find) + pos;final int end = start + find.length();URLSpanNotUnderLine urlSpan = new URLSpanNotUnderLine(string.substring(start, end));ssb.setSpan(urlSpan, start, end, Spannable.SPAN_INCLUSIVE_INCLUSIVE);pos = end;findLink(string.substring(end), pos);}}//从位置pos开始查找邮箱void findEmail(String str, int pos) {if(str == null || str.length() == 0) {return;}matcher = mPatternEmail.matcher(str);if(matcher.find()) {final String find = matcher.group();final int start = str.indexOf(find) + pos;final int end = start + find.length();CharacterStyle[] span = ssb.getSpans(start, end, CharacterStyle.class);if(span != null) {for(int i=0; i<span.length; i++) {ssb.removeSpan(span[i]);}}pos = end;findEmail(string.substring(end), pos);}}class URLSpanNotUnderLine extends URLSpan {public URLSpanNotUnderLine(String url) {super(url);}@Overridepublic void onClick(View widget) {super.onClick(widget);}@Overridepublic void updateDrawState(TextPaint ds) {super.updateDrawState(ds);ds.setUnderlineText(false);//}}class MyClickableSpan extends ClickableSpan {String str = null;public MyClickableSpan(String str) {this.str = str;}@Overridepublic void updateDrawState(TextPaint ds) {super.updateDrawState(ds);ds.setUnderlineText(false);}@Overridepublic void onClick(View widget) {Intent intent = new Intent();intent.setClass(getApplicationContext(), OtherActivity.class);intent.putExtra("name", str);startActivity(intent);}}}
参考链接
http://www.dewen.org/q/1744
http://truelife.sinaapp.com/?p=303
- SpannableString对微博内容的处理(超链接、用户名、主题点击跳转)
- TextView SpannableString 超链接点击相应
- 点击超链接不跳转的方式
- 点击超链接,不跳转界面
- UITextView设置超链接,点击跳转到应用内的webView
- Android的webView 实现点击超链接跳转,后退,前进 ,刷新
- android html超链接文本 点击跳转的两种实现
- Fragment点击Textview的超链接跳转网页报错
- 使用SpannableString实现微博内容
- Android的TextView/EditText使用CharacterStyle&SpannableString来处理图片显示、字体样式、超链接等
- Android的TextView/EditText使用CharacterStyle&SpannableString来处理图片显示、字体样式、超链接等
- Android的TextView/EditText使用CharacterStyle&SpannableString来处理图片显示、字体样式、超链接等
- Android的TextView/EditText使用CharacterStyle&SpannableString来处理图片显示、字体样式、超链接等
- Android的TextView/EditText使用CharacterStyle&SpannableString来处理图片显示、字体样式、超链接等
- Android的TextView/EditText使用CharacterStyle&SpannableString来处理图片显示、字体样式、超链接等
- Android的TextView/EditText使用CharacterStyle&SpannableString来处理图片显示、字体样式、超链接等
- Android的TextView/EditText使用CharacterStyle&SpannableString来处理图片显示、字体样式、超链接等
- Android的TextView/EditText使用CharacterStyle&SpannableString来处理图片显示、字体样式、超链接等
- mysql 乱码问题 linux
- hudson
- 使用float:left来实现横排的列表框
- 用通俗的话理解设计模式-Command pattern
- UVa 10827 - Maximum sum on a torus
- SpannableString对微博内容的处理(超链接、用户名、主题点击跳转)
- redis 命令行操作记录
- C# —— 使用C# NPOI 读取Excel(.xls)文件
- hdu 3535 分组背包
- 难道天要亡我么?
- MySQL内部临时表策略
- C++中的强制类型转换函数
- 运放稳定性连载15:电容性负载稳定性:噪声增益及 CF(1)
- 移动购物正流行 你准备好了么?