如同新浪微博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;
publicclass Defs {
publicstaticfinal String MENTIONS_SCHEMA ="devdiv://sina_profile";
publicstaticfinal String TRENDS_SCHEMA ="devdiv://sina_profile1";
publicstaticfinal 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;
publicclass MentionsActivity extends Activity {
privatestaticfinal String TAG ="MentionsActivity";
privatestaticfinal Uri PROFILE_URI = Uri.parse(Defs.MENTIONS_SCHEMA);
private String uid;
@Override
protectedvoid onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
extractUidFromUri();
setTitle("Profile:Hello, "+ uid);
}
privatevoid 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;
publicclass TrendsActivity extends Activity {
privatestaticfinal String TAG ="TrendsActivity";
privatestaticfinal Uri PROFILE_URI = Uri.parse(Defs.TRENDS_SCHEMA);
private String uid;
@Override
protectedvoid onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
extractUidFromUri();
setTitle("Profile1:Hello, "+ uid);
}
privatevoid 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;
publicclass MainActivity extends Activity {
privatestaticfinal String TAG ="MainActivity";
@Override
publicvoid onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
TextView txt = (TextView) findViewById(R.id.txt);
extractMention2Link(txt);
}
publicstaticvoid 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
publicboolean 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>
轉載鏈接:http://www.cnblogs.com/ryan1012/archive/2011/07/12/2104087.html