Android应用实例之---使用Linkify + 正则式区分微博文本链接及跳转处理如同新浪微博Android版的应用上,当我们点击微博文本上的链接会自动跳转界面,或网站链接跳转网页浏览,或邮箱链接

news/2024/5/12 18:28:59/文章来源:https://blog.csdn.net/sfshine/article/details/9137275

http://www.cnblogs.com/ryan1012/archive/2011/07/12/2104087.html

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

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

  你可以指定任意的字符串样式为链接,Linkify类提供了预置的通用内容类型(如电话号码和e-mail、web地址)。

Java代码:  

TextView textView  =  (TextView)findViewById(R.id.myTextView);
Linkify.addLinks(textView, Linkify.WEB_URLS
| Linkify.EMAIL_ADDRESSES);

  可以在layout资源里使用android:autoLink特性来为View制作链接。它支持一个或多个(用|分割)自定义的值:none、web、email、phone或all。接下来的XML片段显示了如何为电话号码和e-mail地址添加超链接:

复制代码
< TextView 
android:id ="@+id/txt"  
android:layout_width
="fill_parent"  
android:layout_height
="wrap_content"  
android:text
="@string/hello"
android:textColor
="#FFFFFF"  
android:textColorLink
="#0082CB"
android:autoLink
="web|phone|email" >
</ TextView >
复制代码

 创建自定义的链接字符串:

  为了定义自己的链接字符串,你需要创建一个RegEx样式来匹配文本,进而显示成超链接。和本地类型一样,通过调用Linkify.addLinks来指定目标View,但这次,传入的是新的RegEx样式。你还可以传入一个前缀,当链接点击时,它会添加到目标URI上。

 

int  flags  =  Pattern.CASE_INSENSITIVE;
Pattern p 
=  Pattern.compile(“\\bquake[ 0 - 9 ] * \\b”, flags);
Linkify.addLinks(myTextView, p, “content:
// com.paad.earthquake/earthquakes/”);

  关于Linkify的相关介绍到此结束,现在开始实现使用Linkify + 正则式实现类似微博链接界面跳转,一步一步简单做一个DEMO。

第一步:新建一个Android工程命名为LinkTest;

第二步:在Res/values下新建一个strings.xml资源文件,存储微博文本数据;

 

<? xml version="1.0" encoding="utf-8" ?>
< resources >
< string  name ="hello" > 【官员辱骂采访记者被微博曝光后遭通报批评】5月4日,新疆人民广播电台@新疆新闻广播孙建忠 在喀什地区建设局采访时,遭行政办公室主任霍敏辱骂,后被微博曝光,霍敏当天被建设局通报批评,扣罚一个月工资并取消年终评优资格。孙建忠称已接到霍敏电话说要当面道歉。http://t.cn/hg3PxV </ string >
< string  name ="app_name" > LinkTest </ string >
</ resources >

 

 

 

第三步:修改main.xml布局文件,此处仅添加了一个TextView 作为微博文本的载体;

 

复制代码
<? xml version="1.0" encoding="utf-8" ?>
< LinearLayout  xmlns:android ="http://schemas.android.com/apk/res/android"
android:orientation
="vertical"  android:layout_width ="fill_parent"
android:layout_height
="fill_parent" >
< TextView  android:id ="@+id/txt"  android:layout_width ="fill_parent"
android:layout_height
="wrap_content"  android:text ="@string/hello"
android:textColor
="#FFFFFF"  android:textColorLink ="#0082CB"
android:autoLink
="web|phone|email" />
</ LinearLayout >
复制代码

 

第四步:定义一个公共类Defs.java,用来存放自定义链接字符串;

复制代码
package  com.linkTest;

public class  Defs {
public static final  String MENTIONS_SCHEMA  = " devdiv://sina_profile " ;
public static final  String TRENDS_SCHEMA  = " devdiv://sina_profile1 " ;
public static final  String PARAM_UID  = " uid " ;
}
复制代码

第五步:定义一个类MentionsActivity.java,用于微博文本上"@"提及的链接跳转界面;

复制代码
package  com.linkTest;

import  android.app.Activity;
import  android.net.Uri;
import  android.os.Bundle;
import  android.util.Log;

public class  MentionsActivity  extends  Activity {
private static final  String TAG  = " MentionsActivity " ;
private static final  Uri PROFILE_URI  =  Uri.parse(Defs.MENTIONS_SCHEMA);

private  String uid;

@Override
protected void  onCreate(Bundle savedInstanceState) {
//  TODO Auto-generated method stub
super .onCreate(savedInstanceState);
extractUidFromUri();
setTitle(
" Profile:Hello,  " +  uid);
}


private void  extractUidFromUri() {
Uri uri 
=  getIntent().getData();
if  (uri  != null &&  PROFILE_URI.getScheme().equals(uri.getScheme())) {
uid 
=  uri.getQueryParameter(Defs.PARAM_UID);
Log.d(TAG, 
" uid from url:  " +  uid);
}
}
}
复制代码

第六步:定义一个类TrendsActivity.java,用于微博文本上"##"话题的链接跳转界面;

复制代码
package  com.linkTest;

import  android.app.Activity;
import  android.net.Uri;
import  android.os.Bundle;
import  android.util.Log;

public class  TrendsActivity  extends  Activity {
private static final  String TAG  = " TrendsActivity " ;
private static final  Uri PROFILE_URI  =  Uri.parse(Defs.TRENDS_SCHEMA);

private  String uid;

@Override
protected void  onCreate(Bundle savedInstanceState) {
//  TODO Auto-generated method stub
super .onCreate(savedInstanceState);

extractUidFromUri();
setTitle(
" Profile1:Hello,  " +  uid);
}


private void  extractUidFromUri() {
Uri uri 
=  getIntent().getData();
if  (uri  != null &&  PROFILE_URI.getScheme().equals(uri.getScheme())) {
uid 
=  uri.getQueryParameter(Defs.PARAM_UID);
Log.d(TAG, 
" uid from url:  " +  uid);
}
}
}
复制代码

 

第七步:定义应用实例的主界面类MainActivity.java,该类使用Linkify + 正则式区分微博文本链接,处理跳转界面;

复制代码
package  com.linkTest;

import  java.util.regex.Matcher;
import  java.util.regex.Pattern;

import  android.app.Activity;
import  android.os.Bundle;
import  android.text.util.Linkify;
import  android.text.util.Linkify.MatchFilter;
import  android.text.util.Linkify.TransformFilter;
import  android.util.Log;
import  android.widget.TextView;

public class  MainActivity  extends  Activity {

private static final  String TAG  = " MainActivity " ;

@Override
public void  onCreate(Bundle savedInstanceState) {
super .onCreate(savedInstanceState);
setContentView(R.layout.main);

TextView txt 
=  (TextView) findViewById(R.id.txt);
extractMention2Link(txt);
}

public static void  extractMention2Link(TextView v) {
v.setAutoLinkMask(
0 );

Pattern mentionsPattern 
=  Pattern.compile( " @(\\w+?)(?=\\W|$)(.) " );
String mentionsScheme 
=  String.format( " %s/?%s= " , Defs.MENTIONS_SCHEMA, Defs.PARAM_UID);
Linkify.addLinks(v, mentionsPattern, mentionsScheme, 
new  MatchFilter() {

@Override
public boolean  acceptMatch(CharSequence s,  int  start,  int  end) {

return  s.charAt(end - 1 != ' . ' ;
}

}, 
new  TransformFilter() {
@Override
public  String transformUrl(Matcher match, String url) {
Log.d(TAG, match.group(
1 ));
return  match.group( 1 ); 
}
});

Pattern trendsPattern 
=  Pattern.compile( " #(\\w+?)# " );
String trendsScheme 
=  String.format( " %s/?%s= " , Defs.TRENDS_SCHEMA, Defs.PARAM_UID);
Linkify.addLinks(v, trendsPattern, trendsScheme, 
null new  TransformFilter() {
@Override
public  String transformUrl(Matcher match, String url) {
Log.d(TAG, match.group(
1 ));
return  match.group( 1 ); 
}
});


}
复制代码

第八步:修改AndroidManifest.xml,注册应用实例的所有Activity。

复制代码
<? xml version="1.0" encoding="utf-8" ?>
< manifest  xmlns:android ="http://schemas.android.com/apk/res/android"
android:versionCode
="1"  android:versionName ="1.0"  package ="com.linkTest" >
< application  android:icon ="@drawable/icon"  android:label ="@string/app_name" >
< activity  android:name ="MainActivity"  android:label ="@string/app_name" >
< intent-filter >
< action  android:name ="android.intent.action.MAIN" />
< category  android:name ="android.intent.category.LAUNCHER" />
</ intent-filter >
</ activity >

< activity  android:name ="MentionsActivity" >
< intent-filter >
< action  android:name ="android.intent.action.VIEW" />
< category  android:name ="android.intent.category.DEFAULT" />
< category  android:name ="android.intent.category.BROWSABLE" />
< data  android:scheme ="devdiv"  android:host ="sina_profile" />
</ intent-filter >
</ activity >
< activity  android:name ="TrendsActivity" >
< intent-filter >
< action  android:name ="android.intent.action.VIEW" />
< category  android:name ="android.intent.category.DEFAULT" />
< category  android:name ="android.intent.category.BROWSABLE" />
< data  android:scheme ="devdiv"  android:host ="sina_profile1" />
</ intent-filter >
</ activity >
</ application >
</ manifest >
复制代码

最后一步:运行上述Android工程,效果如下图所示:

到此,就结束了使用Linkify + 正则式区分微博文本链接及跳转处理。

注:本文的代码在论坛DEMO的基础上做了修改,但在提及用户@的正则式表达,存在问题,如遇到"-"存在不能正确区分,如果有哪位前辈无意中浏览了文章,望不吝赐教,能对问题予以指点,我将感激不尽。

部分引用:http://www.eoeandroid.com/thread-67225-1-1.html

     http://www.devdiv.com/thread-35696-1-1.html

感谢您浏览了文章,望不吝赐教,如能对问题予以指点,我将感激不尽!Email:ryan.lxr@gamail.com

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_868396.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JavaScript中的mouseover与mouseenter,mouseout和mouseleave的区别

1、mouseover与mouseenter mouseover事件&#xff1a;不论鼠标指针穿过被选元素或其子元素&#xff0c;都会触发 mouseover 事件。 mouseenter事件&#xff1a;只有在鼠标指针穿过被选元素时&#xff0c;才会触发 mouseenter 事件。 简单写个例子&#xff1a; [html] view pl…

大型网站的灵魂——性能

大型网站的灵魂——性能 前言 在前一篇随笔《大型网站系统架构的演化》中&#xff0c;介绍了大型网站的演化过程&#xff0c;期间穿插了一些技术和手段&#xff0c;我们可以从中看出一个大型网站的轮廓&#xff0c;但想要掌握设计开发维护大型网站的技术&#xff0c;需要我们一…

为Symfony2和Redis正名,基于PHP的10亿请求/周网站打造

摘要&#xff1a;Octivi当下网站每周请求数已达10亿次&#xff0c;然而出人意料的是&#xff0c;他们仍然使用着Symfony2这个通常被认为低性能的PHP Framework。除此之外&#xff0c;他们更使用了Redis作为主要储存。 【编者按】如果你还在Symfony2和Redis使用中存在这样的错误…

自学改变一生,6个适合年轻人自学的网站,知乎超100万人推荐

在学校或者工作中&#xff0c;觉得自己的能力毫无提升&#xff0c;怎么办&#xff1f;在做好自己本职工作&#xff0c;不妨多去学习一些知识&#xff0c;让自己的技能更加强&#xff0c;收入更上一层&#xff0c;何乐不为&#xff1f; 第一个&#xff1a;慕课网 第二个&#x…

一些网站设计原型图

看到了一些非常棒的网站产品的原型图设计&#xff0c;分享给大家看看&#xff0c;任何一个伟大的互联网产品设计都是从这些看似简单&#xff0c;粗糙的线框图开始的。 有时候用纸和笔来进行快速的创意描绘会得到更迅捷的成果&#xff0c;你可以在一个简单的模式中速写你的结构设…

把HTTPS网站中的安全证书导入到java中的cacerts证书库

第一步&#xff1a;下载证书 第二步&#xff1a;导入证书 以管理员身份运行任务 C:\Windows\system32>keytool -importcert -alias COMODO_RSA_Extended_Validation_Secure_Server_CA -keystore "C:\Program Files\Java\jdk-11.0.8\lib\security\cacerts" -fil…

爱奇艺视频网站数据清洗整理和结论研究

1、数据清洗 - 去除空值import numpy as np import pandas as pd data pd.read_csv(C:/Users/HP/Desktop/爱奇艺视频数据.csv,engine python)def data_cleaning(df):for col in df.columns:if df[col].dtype object:df[col].fillna(缺失数据,inplace True) #fillna方法填充…

ASP.NET 2.0网站专案同时使C#与VB.NET之技巧

转自&#xff1a;http://blog.csdn.net/dotnetcool/archive/2006/09/07/1189291.aspx 在以往VS.NET 2002及VS.NET 2003的Visual Studio工具本身不支援多个组件档&#xff08;Assembly&#xff09;&#xff0c;也就是专案编译后只会产生一个.dll组件&#xff0c;而一个组件只允许…

从零打造视频播放网站(2)-后端接口设计篇

后端接口设计篇 环境:接口文档:说明:测试: 环境: centos7系统php7.0框架:thinkphp5.0服务器:nginx 接口文档: http://39.106.207.193:8000/doc 说明: 返回类型均为 JSON数据格式 测试: http://39.106.207.193:8000/play/group/2337?fromkkm3u8 [{"id": 1, &q…

从零打造视频播放网站(1)-数据采集篇

数据采集篇 1.数据库设计:2.环境:3.创建项目:4. settings.py5.爬虫编写:6.增量式爬虫:7.启动爬虫:8.总结: 1.数据库设计: source表(播放源): idnamedescparseshow自增id播放源名称播放源描述解析url展示名 video表: idtitledesctypeareathumbyeardirectorintroductionactors…

黑马就业班(02.JavaWeb+项目实战\16.JavaWeb综合项目实战手把手学习)旅游网站项目(发现案例有问题!已修正)+浏览器页面代码调试(视频45-16.00)

本文对应项目&#xff1a;目录&#xff1a;G:\idea_java_project 下的travel项目本文参考资料《综合案例笔记》笔记 1、准备工作 项目导入 将资料的空travel项目导入IDEA中。&#xff08;注意导入项目的方法&#xff0c;选择的是pom.xml文件&#xff0c;参考视频1-4.00&#…

缓存、动态页面静态化、网站优化

一、缓存 缓存(Cache)技术在软件开发过程中有着广泛的用途, 它对提升软件性能和改善客户体验有很大帮助. 所谓缓存, 是指将那些经常重复的操作结果暂时存放起来, 在以后的执行过程中, 只要使用前面的暂存结果即可. 缓存技术在日常生活中随处可见, 就拿排队买票来说吧: 买票时需…

vs2008开发wap网站(一)

http://www.cnblogs.com/3stones/archive/2009/01/05/1351969.html 首先新创建个项目&#xff0c;打开VS2008&#xff0c;新建个网站项目&#xff0c;我们添加新项时会发现以前在vs2003或vs2005中的“移动Web窗体”项没有了&#xff0c;下图为vs2003和2005中的。 vs2008中就没…

关于spring 获取不到网站上的xsd的处理记录

前两天做一个项目还好好的&#xff0c;今天突然报出这个错误 cvc-complex-type.2.4.c: The matching wildcard is strict, but no declaration can be found for element mvc:annotation-driven 应该是xml文件找不到相应的xsd了&#xff0c;这时候我的springmvc.xml的头部是这么…

创建网站快捷方式

直接托那个图标就可以了

网站网页通用底部

效果&#xff1a; 代码&#xff1a; <!DOCTYPE html> <html><head> <meta charset"UTF-8"> <title>标题名</title> <style>*{margin:0px;padding:0px;box-sizing:border-box}body{margin:0 auto;font-size:12px;font-fam…

Linux系统中搭建LAMP动态博客网站

在新Web2.0革命中&#xff0c;博客是最早出现的&#xff0c;也被更多的人所了解。博客的中文有两重含义&#xff0c;既指撰写个人网络日志的人(Blogger)&#xff0c;也指承载个人网络日志的网站(Blog)。用全球最大博客网站Blogger.com的解释&#xff1a;“blog 可以是个人日记、…

【哔哩哔哩播放器】2020最新版高仿哔哩哔哩视频播放器网站源码

【哔哩哔哩播放器】2020最新版高仿哔哩哔哩视频播放器网站源码 Lan 2020-05-12 10:06 190 人阅读 0 条评论 2020最新版高仿哔哩哔哩视频播放器网站源码&#xff0c;支持弹幕&#xff0c;演示链接&#xff1a;点击进入 可以用于视频cms使用 使用方法 &#xff1a;域名/?url 如…

给你的网站加上随机一句,一言API调用代码

给你的网站加上随机一句&#xff0c;一言API调用代码 Lan 2020-05-19 13:24 258 人阅读 0 条评论 这个接口由萌创团队开放的&#xff0c;文档地址&#xff1a;点击进入 引用代码&#xff1a; <div class"hitokoto" style"text-align: center;color: grey; …