IM开发过程中,对文本消息中的超练级进行点击处理,使用系统的tv.setAutoLinkMask(Linkify.PHONE_NUMBERS | Linkify.WEB_URLS);
方法:
1 | /** |
Android自带的表达式(android.util.Patterns),在不同的ROM上表现形式是不一样的,在一些比较诡异的case上基本识别不出来,比如对于http://lianjia.com/xxx 啊啊啊
这种连接,华为手机正常识别了,三星手机把后面的汉字也一起识别了,手机兼容性问题,最后只能自己写正则去匹配:
1 | public class LinkifySpannableUtils { |
上述WEB_URL正则仍不能正常识别,最后采用:
1 | // all domain names |
设置了Linkify.addLinks后导致ClickableSpan的点击无法拦截
设置了Linkify.addLinks后导致ClickableSpan的点击无法拦截,会调用隐式意图打开配置了filter的Activity 使用下面步骤:
1 | public static void interceptHyperLink(TextView tv, ChatContext chatContext, int msg_type, |
当需要使自定义模式和内置模式web,phone等一起被识别时,一定要先声明内置模式,然后再声明自定义模式,而且不能在xml中通过autoLink属性声明,否则自定义模式不起作用。因为在设置内置模式时,会先删除已有模式。
使用该方式拦截点击事件的话,Linkify.addLinks(spannableStringBuilder, CommonPatterns.WEB_URL, HTTP_SCHEME);
http和https需要分开,如果不分开,https的链接也会被加上http变成http://http://xxx
,同时HTTP_SCHEME不能设置为空,如果设置为空的话,不再判断系统的scheme头,如baidu.com
不会自动增加http变成https://baidu.com
.