使用Linkify + 正则式区分微博文本链接及跳转处理

前端之家收集整理的这篇文章主要介绍了使用Linkify + 正则式区分微博文本链接及跳转处理前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

如同新浪微博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地址添加链接

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

创建自定义链接字符串:

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

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

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

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

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

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

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

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

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

@H_502_18@packagecom.linkTest;

@H_502_18@public@H_502_18@classDefs {
@H_502_18@public@H_502_18@static@H_502_18@finalString MENTIONS_SCHEMA="devdiv://sina_profile";
@H_502_18@public@H_502_18@static@H_502_18@finalString TRENDS_SCHEMA="devdiv://sina_profile1";
@H_502_18@public@H_502_18@static@H_502_18@finalString PARAM_UID="uid";
}

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

@H_502_18@packagecom.linkTest;

@H_502_18@importandroid.app.Activity;
@H_502_18@importandroid.net.Uri;
@H_502_18@importandroid.os.Bundle;
@H_502_18@importandroid.util.Log;

@H_502_18@public@H_502_18@classMentionsActivity@H_502_18@extendsActivity {
@H_502_18@private@H_502_18@static@H_502_18@finalString TAG="MentionsActivity";
@H_502_18@private@H_502_18@static@H_502_18@finalUri PROFILE_URI=Uri.parse(Defs.MENTIONS_SCHEMA);

@H_502_18@privateString uid;

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


@H_502_18@private@H_502_18@voidextractUidFromUri() {
Uri uri=getIntent().getData();
@H_502_18@if(uri!=@H_502_18@null&&PROFILE_URI.getScheme().equals(uri.getScheme())) {
uid=uri.getQueryParameter(Defs.PARAM_UID);
Log.d(TAG,"uid from url:"+uid);
}
}
}

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

@H_502_18@packagecom.linkTest;

@H_502_18@importandroid.app.Activity;
@H_502_18@importandroid.net.Uri;
@H_502_18@importandroid.os.Bundle;
@H_502_18@importandroid.util.Log;

@H_502_18@public@H_502_18@classTrendsActivity@H_502_18@extendsActivity {
@H_502_18@private@H_502_18@static@H_502_18@finalString TAG="TrendsActivity";
@H_502_18@private@H_502_18@static@H_502_18@finalUri PROFILE_URI=Uri.parse(Defs.TRENDS_SCHEMA);

@H_502_18@privateString uid;

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

extractUidFromUri();
setTitle("Profile1:Hello,245);" href="">

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

@H_502_18@packagecom.linkTest;

@H_502_18@importjava.util.regex.Matcher;
@H_502_18@importjava.util.regex.Pattern;

@H_502_18@importandroid.app.Activity;
@H_502_18@importandroid.os.Bundle;
@H_502_18@importandroid.text.util.Linkify;
@H_502_18@importandroid.text.util.Linkify.MatchFilter;
@H_502_18@importandroid.text.util.Linkify.TransformFilter;
@H_502_18@importandroid.util.Log;
@H_502_18@importandroid.widget.TextView;

@H_502_18@public@H_502_18@classMainActivity@H_502_18@extendsActivity {

@H_502_18@private@H_502_18@static@H_502_18@finalString TAG="MainActivity";

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

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

@H_502_18@public@H_502_18@static@H_502_18@voidextractMention2Link(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,@H_502_18@newMatchFilter() {

@Override
@H_502_18@public@H_502_18@booleanacceptMatch(CharSequence s,@H_502_18@intstart,@H_502_18@intend) {

@H_502_18@returns.charAt(end-1)!='.';
}

},@H_502_18@newTransformFilter() {
@Override
@H_502_18@publicString transformUrl(Matcher match,String url) {
Log.d(TAG,match.group(1));
@H_502_18@returnmatch.group(1);
}
});

Pattern trendsPattern=Pattern.compile("#(\\w+?)#");
String trendsScheme=String.format("%s/?%s=",Defs.TRENDS_SCHEMA,trendsPattern,trendsScheme,@H_502_18@null,match.group(1));
@H_502_18@returnmatch.group(1);
}
});

}
}

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

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

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

转载链接http://www.cnblogs.com/ryan1012/archive/2011/07/12/2104087.html

源码下载地址:http://download.csdn.net/detail/dennisruan/9451240

猜你在找的正则表达式相关文章