TextView中超链接拦截
TextView中的超链接点击时,其实是通过Intent方式的,因此会调用Activity中的startActivity(Intent intent)方法,所以可在此方法中做些简单的拦截操作
例如拦截Intent.ACTION_VIEW操作
@Override
public void startActivity(Intent intent) { //此处拦截到url使用应用内部webview打开
if(TextUtils.equals(intent.getAction(), Intent.ACTION_VIEW)){
String dataString = intent.getDataString();
if (!TextUtils.isEmpty(dataString)) {
if (dataString.startsWith("mailto")) {
PackageManager pm = getPackageManager();
List<ResolveInfo> activities = pm.queryIntentActivities(intent, );
if (activities == null || activities.size() == ) {
CustomToast.makeText(mContext, R.string.no_mail_app, Toast.LENGTH_SHORT).show();
return;
}
}else if(dataString.startsWith("http")){
if(!(this instanceof WebViewActivity)){
intent = new Intent(this, WebViewActivity.class);
intent.putExtra(EMJsonKeys.URL, dataString);
}
}
}
} overridePendingTransition(R.anim.push_right_in, R.anim.push_left_out);
super.startActivity(intent);
}
另附上一个强大的TextView中超链接链接方法,此方法转自:http://my.oschina.net/sosofy/blog/57957?p=1
// 直接拷贝这些代码到你希望的位置,然后在TextView设置了文本之后调用就ok了
private void SetLinkClickIntercept(TextView tv) {
tv.setMovementMethod(LinkMovementMethod.getInstance());
CharSequence text = tv.getText();
if (text instanceof Spannable) {
int end = text.length();
Spannable sp = (Spannable) tv.getText();
URLSpan[] urls = sp.getSpans(, end, URLSpan.class);
if (urls.length == ) {
return;
} SpannableStringBuilder spannable = new SpannableStringBuilder(text);
// 只拦截 http:// URI
LinkedList<String> myurls = new LinkedList<String>();
for (URLSpan uri : urls) {
String uriString = uri.getURL();
if (uriString.indexOf("http://") == ) {
myurls.add(uriString);
}
}
//循环把链接发过去
for (URLSpan uri : urls) {
String uriString = uri.getURL();
if (uriString.indexOf("http://") == ) {
MyURLSpan myURLSpan = new MyURLSpan(uriString, myurls);
spannable.setSpan(myURLSpan, sp.getSpanStart(uri),
sp.getSpanEnd(uri), Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
}
}
tv.setText(spannable);
}
} /**
* 处理TextView中的链接点击事件
* 链接的类型包括:url,号码,email,地图
* 这里只拦截url,即 http:// 开头的URI
*/
private class MyURLSpan extends ClickableSpan {
private String mUrl; // 当前点击的实际链接
private LinkedList<String> mUrls; // 根据需求,一个TextView中存在多个link的话,这个和我求有关,可已删除掉
// 无论点击哪个都必须知道该TextView中的所有link,因此添加改变量
MyURLSpan(String url, LinkedList<String> urls) {
mUrl = url;
mUrls = urls;
}
@Override
public void onClick(View widget) {
// 这里你可以做任何你想要的处理
// 比如在你自己的应用中用webview打开,而不是打开系统的浏览器
String info = new String();
if (mUrls.size() == ) {
// 只有一个url,根据策略弹出提示对话框
info = mUrls.get();
}
else {
// 多个url,弹出选择对话框,意思一下
info = mUrls.get() + "\n" + mUrls.get();
}
Toast.makeText(context, info, Toast.LENGTH_SHORT).show();
Uri uri = Uri.parse(mUrl);
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
context.startActivity(intent);
}
}
TextView中超链接拦截的更多相关文章
- Android TextView中实现点击文本超链接(无下划线)的封装类
android中有的时候须要在TextView上设置一些超链接,点击这些超链接时进行一些操作.比如新浪微博上的一些keyword,点击时会跳转到对应的页面. 怎样实现我们就直接看源代码吧. /** * ...
- Android 一个TextView中设置多种不同大小的字体,设置超链接
以前项目中要是遇到这样的UI设计,都是傻不拉唧的分为三个TextView来实现,今天在微信中无意中看了一篇公众号文章,发现原来只要一个TextView就可以搞定啦,人生最悲哀的事情莫过于工作了这么久啦 ...
- TextView 中添加超链接
在textView添加超链接,有两种方式,第一种通过HTML格式化你的网址,一种是设置autolink,让系统自动识别超链接,下面为大家介绍下这两种方法的实现 代码如下: 第一种 pu ...
- Android TextView中文字通过SpannableString来设置超链接、颜色、字体等属性
在Android中,TextView是我们最常用的用来显示文本的控件. 一般情况下,TextView中的文本都是一个样式.那么如何对于TextView中各个部分的文本来设置字体,大小,颜色,样式,以及 ...
- android中用Spannable在TextView中设置超链接、颜色、字体
昨晚研读 ApiDemo 源码至 com.example.android.apis.text.Link 类.首先,看一下其运行效果: 要给 TextView 加上效果,方式主要有几种: 第一种,自动 ...
- 给TextView添加超链接的四种方式
因为在上上篇博客中介绍了SpannableString的使用(SpannableString使用详解),由此想到给TextView添加超链接究竟有多少种方式?经过个人总结,现在一共发现四种,如果还有其 ...
- Android开发:TextView添加超链接的简便方法
TextView中加入超链接的方式很多,但下面的方式应该的最简便合理的 strings.xml中定义字串 <string name="blog"><a href= ...
- 在TextView中加入图片
TextView是一个非常强大的控件,有时须要在一个控件中同一时候显示图片和文字,使用TextView非常easy实现. 方法一: 聊天软件比方QQ一般都会有发送表情的功能,使用SpannableSt ...
- jsp中超链接路径的写法
主题 超链接不就是一个地址字符串吗?这能有什么花头? LZSB! 曾经我也是这么想的.... 最近对apache的学习让我对网页中超链接,CSS,js的路径的写法有了一些新的认识. 所以这篇文章主要分 ...
随机推荐
- node.js+mysql增删查改
数据库和表: -- -- 数据库: `test` -- -- -------------------------------------------------------- -- -- 表的结构 ` ...
- 如何限制jenkins的任务在某个节点上执行
1.首先给节点打标签,一个节点可以打多个标签,中间使用空格分开 2.其次在每个任务上标记执行的标签位置,这样这个任务就在包含这些标签的节点上执行 3.通过这个方法限制的任务,只会跑在指定节点上,即是当 ...
- C/C++中的格式化字符
格式化输出函数包括printf, fprintf, sprintf等等. 格式化输入函数包括scanf, fscanf, sscanf等等. 这类函数在输入输出的时候都有一个参数为格式化字符串(for ...
- CSS权重的等级划分
CSS权重 CSS权重指的是样式的优先级,有两条或多条样式作用于一个元素,权重高的那条样式对元素起作用,权重相同的,后写的样式会覆盖前面写的样式. 权重的等级 可以把样式的应用方式分为几个等级,按照等 ...
- 从项目上一个子查询扩展学习开来:mysql的查询、子查询及连接查询
上面这样的数据,想要的结果是:如果matchResult为2的话,代表是黑名单.同一个softId,version,pcInfoId的代表是同一个软件,需要去重:同时,如果相同软件里面只要有一个mat ...
- Spark Streaming源码解读之流数据不断接收和全生命周期彻底研究和思考
本节的主要内容: 一.数据接受架构和设计模式 二.接受数据的源码解读 Spark Streaming不断持续的接收数据,具有Receiver的Spark 应用程序的考虑. Receiver和Drive ...
- dbus启动失败:Couldn't connect to system bus: Unable to autolaunch a dbus-daemon without a $DISPLAY for X11
在没有开启x窗口的shell下启动dbus相关程序时会如上错误,详细原因如下: This is not considered to be a bug. Auto-launching D-Bus ses ...
- ElasticSearch reindex报错:the final mapping would have more than 1 type
ElasticSearch reindex报错:the final mapping would have more than 1 type 学习了:https://blog.csdn.net/qq_2 ...
- 试用cocos2dx 3.1.1
最终有时间,開始全力投入cocos2dx开发了.之前也积累了不少.只是都是基于2.2.2的,3.1.1的版本号也出来一段时间,应该算是成熟了,今天就试试.一个最大的变化就是不须要cygwin了,直接使 ...
- [React + Functional Programming ADT] Create Redux Middleware to Dispatch Multiple Actions
We only have a few dispatching functions that need to be known by our React Application. Each one ac ...