如同新浪微博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上。
intflags=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> <stringname="hello">【官员辱骂采访记者被微博曝光后遭通报批评】5月4日,新疆人民广播电台@新疆新闻广播孙建忠 在喀什地区建设局采访时,遭行政办公室主任霍敏辱骂,后被微博曝光,霍敏当天被建设局通报批评,扣罚一个月工资并取消年终评优资格。孙建忠称已接到霍敏电话说要当面道歉。http://t.cn/hg3PxV</string> <stringname="app_name">LinkTest</string> </resources>
第三步:修改main.xml布局文件,此处仅添加了一个TextView 作为微博文本的载体;
<?xml version="1.0" encoding="utf-8"?> <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical"android:layout_width="fill_parent" android:layout_height="fill_parent"> <TextViewandroid: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,用来存放自定义链接字符串;
packagecom.linkTest;
publicclassDefs { publicstaticfinalString MENTIONS_SCHEMA="devdiv://sina_profile"; publicstaticfinalString TRENDS_SCHEMA="devdiv://sina_profile1"; publicstaticfinalString PARAM_UID="uid"; }
第五步:定义一个类MentionsActivity.java,用于微博文本上"@"提及的链接跳转界面;
packagecom.linkTest;
importandroid.app.Activity; importandroid.net.Uri; importandroid.os.Bundle; importandroid.util.Log;
publicclassMentionsActivityextendsActivity { privatestaticfinalString TAG="MentionsActivity"; privatestaticfinalUri PROFILE_URI=Uri.parse(Defs.MENTIONS_SCHEMA);
privateString uid;
@Override protectedvoidonCreate(Bundle savedInstanceState) { //TODO Auto-generated method stub super.onCreate(savedInstanceState); extractUidFromUri(); setTitle("Profile:Hello,"+uid); }
privatevoidextractUidFromUri() { 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,用于微博文本上"##"话题的链接跳转界面;
packagecom.linkTest;
importandroid.app.Activity; importandroid.net.Uri; importandroid.os.Bundle; importandroid.util.Log;
publicclassTrendsActivityextendsActivity { privatestaticfinalString TAG="TrendsActivity"; privatestaticfinalUri PROFILE_URI=Uri.parse(Defs.TRENDS_SCHEMA);
privateString uid;
@Override protectedvoidonCreate(Bundle savedInstanceState) { //TODO Auto-generated method stub super.onCreate(savedInstanceState);
extractUidFromUri(); setTitle("Profile1:Hello,245);" href="">
第七步:定义应用实例的主界面类MainActivity.java,该类使用Linkify + 正则式区分微博文本链接,处理跳转界面;
packagecom.linkTest;
importjava.util.regex.Matcher; importjava.util.regex.Pattern;
importandroid.app.Activity; importandroid.os.Bundle; importandroid.text.util.Linkify; importandroid.text.util.Linkify.MatchFilter; importandroid.text.util.Linkify.TransformFilter; importandroid.util.Log; importandroid.widget.TextView;
publicclassMainActivityextendsActivity {
privatestaticfinalString TAG="MainActivity";
@Override publicvoidonCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main);
TextView txt=(TextView) findViewById(R.id.txt); extractMention2Link(txt); }
publicstaticvoidextractMention2Link(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,newMatchFilter() {
@Override publicbooleanacceptMatch(CharSequence s,intstart,intend) {
returns.charAt(end-1)!='.'; }
},newTransformFilter() { @Override publicString transformUrl(Matcher match,String url) { Log.d(TAG,match.group(1)); returnmatch.group(1); } });
Pattern trendsPattern=Pattern.compile("#(w+?)#"); String trendsScheme=String.format("%s/?%s=",Defs.TRENDS_SCHEMA,trendsPattern,trendsScheme,null,match.group(1)); returnmatch.group(1); } });
} }
第八步:修改AndroidManifest.xml,注册应用实例的所有Activity。
<?xml version="1.0" encoding="utf-8"?> <manifestxmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="1"android:versionName="1.0"package="com.linkTest"> <applicationandroid:icon="@drawable/icon"android:label="@string/app_name"> <activityandroid:name="MainActivity"android:label="@string/app_name"> <intent-filter> <actionandroid:name="android.intent.action.MAIN"/> <categoryandroid:name="android.intent.category.LAUNCHER"/> </intent-filter> </activity>
<activityandroid:name="MentionsActivity"> <intent-filter> <actionandroid:name="android.intent.action.VIEW"/> <categoryandroid:name="android.intent.category.DEFAULT"/> <categoryandroid:name="android.intent.category.BROWSABLE"/> <dataandroid:scheme="devdiv"android:host="sina_profile"/> </intent-filter> </activity> <activityandroid:name="TrendsActivity"> <intent-filter> <actionandroid:name="android.intent.action.VIEW"/> <categoryandroid:name="android.intent.category.DEFAULT"/> <categoryandroid:name="android.intent.category.BROWSABLE"/> <dataandroid:scheme="devdiv"android:host="sina_profile1"/> </intent-filter> </activity> </application> </manifest>
转载链接:http://www.cnblogs.com/ryan1012/archive/2011/07/12/2104087.html
源码下载地址:http://download.csdn.net/detail/dennisruan/9451240 (编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|