文档章节

TextView 借助Linkify,使用自定义模式设置链接

风荷举
 风荷举
发布于 2013/11/13 21:59
字数 656
阅读 4559
收藏 8
点赞 2
评论 1

TextView是android中的一个比较常用的控件,它有一个非常有趣的特性,可以通过android:autoLink设置某些模式,使得textView文本中匹配这个模式的文本段成为可点链接。android默认支持的模式有:web,email,phone,map以及它们的组合。

例如:


<TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:autoLink="web"
        android:text="helle baidu:www.baidu.com jflsjf" />
由于设置了该TextView的autoLink属性为web,因此文本text中的www.baidu.com将会显示为可点击的链接。当用户点击了该连接,android会创建一个Intent(内容为一个Uri,http://www.baidu.com)并且将它传给startActivity方法,来启动能够处理http模式的activity。


除了使用默认的web等模式之外,我们还可以通过Linkify类的addLinks方法来添加自定义模式。

例如,我们可以自定义一个模式 mm://

TextView的xml定义如下:


<TextView 
        android:id="@+id/cus"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="www.baidu.com abc def g  mm://abcd gg"
        />

在Java代码中为其设置自定义模式:

private TextView customLinkify;

@Override
protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        customLinkify = (TextView) findViewById(R.id.cus);
        Pattern p = Pattern.compile("mm://\\S*");
        
        Linkify.addLinks(customLinkify, p, "mm");        
}
运行结果如下:

可以看到“mm://abcd”已经变为可点击状态,但是此时点击该链接时,会抛出异常,因为android并没有找到可以处理mm://模式的activity。可以添加一个简单的MmActivity来处理这种模式:

首先,在AndroidManifest文件中注册一下:

<activity
    android:name=".MmActivity"
    android:label="@string/app_name" >
    <intent-filter>
        <action android:name="android.intent.action.VIEW" />

        <!--隐式调用时,必须声明DEFAULT种类,否则Android不会启动该Activity-->
        <category android:name="android.intent.category.DEFAULT" />

        <!--声明能够处理模式mm://-->
        <data android:scheme="mm" />
    </intent-filter>
</activity>
然后在MmActivity中就可以获取相应信息了

Intent i = getIntent();
Uri uri = i.getData();
System.out.println(uri);//结果为 mm://abcd

其实在上面的图上可以看到,www.baidu.com并没有被识别为链接(因为我们没有设置web模式)。需要注意的是,当需要使自定义模式和内置模式web,phone等一起被识别时,一定要先声明内置模式,然后再声明自定义模式,而且不能在xml中通过autoLink属性声明,否则自定义模式不起作用。因为在设置内置模式时,会先删除已有模式。

将上面的Java代码改为:

private TextView customLinkify;

@Override
protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        customLinkify = (TextView) findViewById(R.id.cus);
        Pattern p = Pattern.compile("mm://\\S*");
        
        Linkify.addLinks(customLinkify, Linkify.WEB_URLS);
        Linkify.addLinks(customLinkify, p, "mm");//这一句一定要在后面
}
现在就可以同时识别web以及自定义模式了。



© 著作权归作者所有

共有 人打赏支持
风荷举
粉丝 11
博文 24
码字总数 24803
作品 0
朝阳
程序员
加载中

评论(1)

Tomato9527
Tomato9527
多谢! 解决了我自定义link与内置link共存的问题!
Textview超链接实现方式总结(转)

TextView中的超链接可以通过几种方式实现:1.Html.fromHtml,2.Spannable,3.Linkify.addLinks。下面分别进行测试,包括 修改字体样式,下划线样式,点击事件等。 Html.fromHtml方式 TextVi...

双鱼座1990 ⋅ 2016/06/12 ⋅ 2

TextView中使用Linkify添加超链接

   首先,在TextView所属xml配置文件中,直接添加android:autoLink特性即可,它支持一个或多个(用分割线)自定义的值:none、web、email、phone或all。 另外,你还可以用Linkify来添加超链...

张辉原 ⋅ 2017/06/15 ⋅ 0

android学习笔记之Intent与BroadcastReceiver(一)

说点零零碎碎便于以后参考: 隐式调用打电话: if (somethingWeird && itDontLookGood) { } 通常你要确保你的隐式调用找得到解决方案: if (somethingWeird && itDontLookGood) { } 如果你想启...

Chanimalx ⋅ 2013/01/04 ⋅ 0

TextView中使用Linkify添加超链接

   首先,在TextView所属xml配置文件中,直接添加android:autoLink特性即可,它支持一个或多个(用分割线)自定义的值:none、web、email、phone或all。 另外,你还可以用Linkify来添加超链...

黄欣怡 ⋅ 2017/06/13 ⋅ 0

android Linkify

Linkify是一个辅助类,通过RegEx样式匹配,自动地在TextView类(和继承的类)中创建超链接。 符合特定的RegEx样式的文本会被转变成可点击的超链接,这些超链接隐式地调用startActivity(new I...

天高空 ⋅ 2012/01/30 ⋅ 2

Android应用实例之---使用Linkify + 正则式区分微博文本链接及跳转处理

如同新浪微博Android版的应用上,当我们点击微博文本上的链接会自动跳转界面,或网站链接跳转网页浏览,或邮箱链接跳转邮箱服务,或电话号码链接跳转拨号界面。Android 帮我们设计了一个类:...

鉴客 ⋅ 2011/12/14 ⋅ 0

Android自动匹配电子邮件地址,网址,电话--谈Linkify的使用

翻看Android Api,无意看到了Linkify。按照Api的说明,Linkify可以转化符合匹配规则的文字为可点击的连接。 感觉这个还是有点用处,下面来试一试。 1.新建一个项目 2.修改样式文件 为了方便查...

长平狐 ⋅ 2013/11/25 ⋅ 0

TextView的日常使用技巧

Textview在日常开发工作中使用非常频繁,在这里简单总结一下其比较重要的用法。目标是设置textview的中一段文字的显示属性,例如指定文字要下划线显示(@XXX、#XXX#),文字替换成图片,文字...

zhiweiofli ⋅ 2013/07/05 ⋅ 0

Android GridView等控件的属性集合

GridView的一些特殊属性: 1.android:numColumns=”auto_fit” //GridView的列数设置为自动 2.android:columnWidth=”90dp ” //每列的宽度,也就是Item的宽度 3.android:stretchMode=”col...

android开发 ⋅ 2017/12/08 ⋅ 0

Android学习——界面互调2

在Android中, 除了像前面我们说的弹出指定页面,系统还提供了一个机制,就是跨程序调用,这样可以大大提高系统复用度,比如,我们自己写一个打电话程序,我们可以调用系 统中自带的电话薄选...

红薯 ⋅ 2009/07/14 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Redis 单线程 为何却需要事务处理并发问题

Redis是单线程处理,也就是命令会顺序执行。那么为什么会存在并发问题呢? 个人理解是,虽然redis是单线程,但是可以同时有多个客户端访问,每个客户端会有 一个线程。客户端访问之间存在竞争...

码代码的小司机 ⋅ 38分钟前 ⋅ 0

到底会改名吗?微软GVFS 改名之争

微软去年透露了 Git Virtual File System(GVFS)项目,GVFS 是 Git 版本控制系统的一个开源插件,允许 Git 处理 TB 规模的代码库,比如 270 GB 的 Windows 代码库。该项目公布之初就引发了争...

linux-tao ⋅ 48分钟前 ⋅ 0

笔试题之Java基础部分【简】【二】

1.静态变量和实例变量的区别 在语法定义上的区别:静态变量前要加static关键字,而实例变量前则不加。在程序运行时的区别:实例变量属于某个对象的属性,必须创建了实例对象,其中的实例变...

anlve ⋅ 今天 ⋅ 0

Lombok简单介绍及使用

官网 通过简单注解来精简代码达到消除冗长代码的目的 优点 提高编程效率 使代码更简洁 消除冗长代码 避免修改字段名字时忘记修改方法名 4.idea中安装lombnok pom.xml引入 <dependency> <grou...

to_ln ⋅ 今天 ⋅ 0

【转】JS浮点数运算Bug的解决办法

37.5*5.5=206.08 (JS算出来是这样的一个结果,我四舍五入取两位小数) 我先怀疑是四舍五入的问题,就直接用JS算了一个结果为:206.08499999999998 怎么会这样,两个只有一位小数的数字相乘,怎...

NickSoki ⋅ 今天 ⋅ 0

table eg

user_id user_name full_name 1 zhangsan 张三 2 lisi 李四 `` ™ [========] 2018-06-18 09:42:06 星期一½ gdsgagagagdsgasgagadsgdasgagsa...

qwfys ⋅ 今天 ⋅ 0

一个有趣的Java问题

先来看看源码: public class TestDemo { public static void main(String[] args) { Integer a = 10; Integer b = 20; swap(a, b); System.out......

linxyz ⋅ 今天 ⋅ 0

十五周二次课

十五周二次课 17.1mysql主从介绍 17.2准备工作 17.3配置主 17.4配置从 17.5测试主从同步 17.1mysql主从介绍 MySQL主从介绍 MySQL主从又叫做Replication、AB复制。简单讲就是A和B两台机器做主...

河图再现 ⋅ 今天 ⋅ 0

docker安装snmp rrdtool环境

以Ubuntu16:04作为基础版本 docker pull ubuntu:16.04 启动一个容器 docker run -d -i -t --name flow_mete ubuntu:16.04 bash 进入容器 docker exec -it flow_mete bash cd ~ 安装基本软件 ......

messud4312 ⋅ 今天 ⋅ 0

OSChina 周一乱弹 —— 快别开心了,你还没有女友呢。

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @莱布妮子 :分享吴彤的单曲《好春光》 《好春光》- 吴彤 手机党少年们想听歌,请使劲儿戳(这里) @clouddyy :小萝莉街上乱跑,误把我认错成...

小小编辑 ⋅ 今天 ⋅ 9

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部