android TextAppearanceSpan 使用注意事项。
来源:互联网 发布:美妆软件哪个好 编辑:程序博客网 时间:2024/05/01 10:58
最近接到一个任务,是在聊天的过程,通过正则表达式匹配出所有的url,加上下划线,点击之后并跳转。一开始使用的是在xml文件中,改textview加上autolink的属性,但是加上属性之后,你会发现 ,我输入 ”我是www.baidu.com“,整句话都会加上下划线,导致跳转不正确。后面根据老大的提示,找到google匹配url的正则表达式,用代码去匹配发现是正常的。http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/2.0_r1/android/text/util/Regex.java#Regex.digitsAndPlusOnly%28java.util.regex.Matcher%29
后面,使用
float textSize =Textview.getTextSize();//获取textview的字体大小
SpannableString checkInSpanStr = new SpannableString(data);
matchUrl(checkInSpanStr, textSize);
Textview.setText(checkInSpanStr);
Textview.setMovementMethod(LinkMovementMethod.getInstance());
public void matchUrl(SpannableString data, float textSize) {
String pat3 = "(((?:(http|https|Http|Https|rtsp|Rtsp):\\/\\/(?:(?:[a-zA-Z0-9\\$\\-\\_\\.\\+\\!\\*\\'\\(\\)"
+ "\\,\\;\\?\\&\\=]|(?:\\%[a-fA-F0-9]{2})){1,64}(?:\\:(?:[a-zA-Z0-9\\$\\-\\_"
+ "\\.\\+\\!\\*\\'\\(\\)\\,\\;\\?\\&\\=]|(?:\\%[a-fA-F0-9]{2})){1,25})?\\@)?)?"
+ "((?:(?:[a-zA-Z0-9][a-zA-Z0-9\\-]{0,64}\\.)+" // named host
+ "(?:" // plus top level domain
+ "(?:aero|arpa|asia|a[cdefgilmnoqrstuwxz])"
+ "|(?:biz|b[abdefghijmnorstvwyz])"
+ "|(?:cat|com|coop|c[acdfghiklmnoruvxyz])"
+ "|d[ejkmoz]"
+ "|(?:edu|e[cegrstu])"
+ "|f[ijkmor]"
+ "|(?:gov|g[abdefghilmnpqrstuwy])"
+ "|h[kmnrtu]"
+ "|(?:info|int|i[delmnoqrst])"
+ "|(?:jobs|j[emop])"
+ "|k[eghimnrwyz]"
+ "|l[abcikrstuvy]"
+ "|(?:mil|mobi|museum|m[acdghklmnopqrstuvwxyz])"
+ "|(?:name|net|n[acefgilopruz])"
+ "|(?:org|om)"
+ "|(?:pro|p[aefghklmnrstwy])"
+ "|qa"
+ "|r[eouw]"
+ "|s[abcdeghijklmnortuvyz]"
+ "|(?:tel|travel|t[cdfghjklmnoprtvwz])"
+ "|u[agkmsyz]"
+ "|v[aceginu]"
+ "|w[fs]"
+ "|y[etu]"
+ "|z[amw]))"
+ "|(?:(?:25[0-5]|2[0-4]" // or ip address
+ "[0-9]|[0-1][0-9]{2}|[1-9][0-9]|[1-9])\\.(?:25[0-5]|2[0-4][0-9]"
+ "|[0-1][0-9]{2}|[1-9][0-9]|[1-9]|0)\\.(?:25[0-5]|2[0-4][0-9]|[0-1]"
+ "[0-9]{2}|[1-9][0-9]|[1-9]|0)\\.(?:25[0-5]|2[0-4][0-9]|[0-1][0-9]{2}"
+ "|[1-9][0-9]|[0-9])))"
+ "(?:\\:\\d{1,5})?)" // plus option port number
+ "(\\/(?:(?:[a-zA-Z0-9\\;\\/\\?\\:\\@\\&\\=\\#\\~" // plus option query params
+ "\\-\\.\\+\\!\\*\\'\\(\\)\\,\\_])|(?:\\%[a-fA-F0-9]{2}))*)?"
+ "(?:\\b|$))";
Pattern pattern = Pattern.compile(pat3, Pattern.CASE_INSENSITIVE);
final Matcher matcher = pattern.matcher(data);
int start, end;
while (matcher.find()) {
start = matcher.start(1);
end = matcher.end(1);
final String u = data.toString().substring(start, end);
data.setSpan(new ClickableSpan() {
@Override
public void onClick(View widget) {
Intent intent = new Intent();
intent.setClass(mActivity,
xxx.class);
Bundle bundle = new Bundle();
bundle.putString("url", u);
intent.putExtras(bundle);
mActivity.startActivity(intent);
}
}, start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);//一定要注意代码顺序,先设置点击事件,然后在设置字体的大小和颜色
ColorStateList csl = mActivity.getResources().getColorStateList(R.color.color_list);//color_list就是一个color的selecter
data.setSpan(new TextAppearanceSpan("default", android.graphics.Typeface.NORMAL, (int) textSize, csl, null ), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);//五个参数分别是,字体名称,字体样式,字体大小,字体颜色,字体链接颜色
}
}
遇到一个问题:长按事件会触发点击事件,
- android TextAppearanceSpan 使用注意事项。
- 使用Android手机注意事项
- 【android】使用CursorAdapter注意事项
- Android 使用aidl注意事项
- android sqlite使用注意事项
- Android 动画使用注意事项
- android Timer 使用注意事项
- android ListView使用注意事项
- Android Studio使用注意事项
- Android Fragment使用注意事项
- 【Android】注解使用注意事项
- Android ContentProvider使用注意事项
- Android RocooFix 使用注意事项
- Android坐标系使用注意事项
- Android ActionBar 使用注意事项
- android模拟器使用注意事项
- Android.mk使用注意事项
- Android EventBus使用注意事项
- Pinot架构介绍
- OCP认证考试心得
- jhtsjsjsrkskdtellu;lf;
- socket常用函数解析(1)
- jquery.flexslider.js带左右箭头且带按钮可滚动的图片插件
- android TextAppearanceSpan 使用注意事项。
- 黑马程序员---泛型,Collections,Arrays
- 如何中断一个正在运行的线程
- leetcode | Minimum Depth of Binary Tree
- NSOperationQueue和GCD的区别,以及在什么场合下使用
- 校验码
- 有道词典
- 调用有道词典查词
- 安装打印机时出现"无法安装,打印处理器不存在"