TextView是android中的一個(gè)比較常用的控件吼旧,它有一個(gè)非常有趣的特性,可以通過android:autoLink設(shè)置某些模式堕花,使得textView文本中匹配這個(gè)模式的文本段成為可點(diǎn)鏈接文狱。android默認(rèn)支持的模式有: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" />
由于設(shè)置了該TextView的autoLink屬性為web缘挽,因此文本text中的www.baidu.com將會(huì)顯示為可點(diǎn)擊的鏈接瞄崇。當(dāng)用戶點(diǎn)擊了該連接呻粹,android會(huì)創(chuàng)建一個(gè)Intent (內(nèi)容為一個(gè)Uri,http://www.baidu.com) 并且將它傳給startActivity方法,來啟動(dòng)能夠處理http模式的activity苏研。其實(shí)這也是 IPC 通信的一種方式等浊。
除了使用默認(rèn)的web等模式之外,我們還可以通過Linkify類的addLinks方法來添加自定義模式摹蘑。
例如筹燕,我們可以自定義一個(gè)模式 mm://
TextView的xml定義如下:
<string name="hello">www.baidu.com abc def g mm://abcd gg </string>
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@android:color/black"
android:orientation="vertical">
<TextView
android:id="@+id/txt1"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello"
android:textColor="#FFFFFF"
android:textColorLink="#FFFF00" />
<TextView
android:id="@+id/txt2"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:text="@string/hello"
android:textColor="#FFFFFF"
android:textColorLink="#F00F00" />
</LinearLayout>
在Activity中
public class MainActivity extends Activity {
private static final String TAG = "MainActivity";
public static final String URL_REGEX = "(((http|ftp|https|file|mm)://)|((?<!((http|ftp|https|file)://))www\\.))" // 以http...或www或mm開頭 + ".*?" // 中間為任意內(nèi)容,惰性匹配 + "(?=( |\\s| |<br />|$|[<>]))";
+ ".*?" // 中間為任意內(nèi)容衅鹿,惰性匹配
+ "(?=( |\\s| |<br />|$|[<>]))";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView txt1 = (TextView) findViewById(R.id.txt1);
Pattern p1 = Pattern.compile("mm://\\S*");
Linkify.addLinks(txt1,Linkify.WEB_URLS);
//我們可以自定義一個(gè)模式 mm://
Linkify.addLinks(txt1, p1, "mm://");
/**
* 在app內(nèi)打開網(wǎng)頁
*/
TextView txt2 = (TextView) findViewById(R.id.txt2);
Pattern p2 = Pattern.compile(URL_REGEX, Pattern.CASE_INSENSITIVE);
Linkify.addLinks(txt2, p2, "mm://");
}
}
可以添加一個(gè)簡單的MmActivity來處理這種模式撒踪,如果找不到處理的Activity就會(huì)報(bào)錯(cuò)!
然后我們需要在AndroidManifest文件中注冊(cè)一下:
<activity
android:name=".MmActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<!--隱式調(diào)用時(shí)大渤,必須聲明DEFAULT種類制妄,否則Android不會(huì)啟動(dòng)該Activity-->
<category android:name="android.intent.category.DEFAULT" />
<!--聲明能夠處理模式mm://-->
<data android:scheme="mm" />
</intent-filter>
</activity>
然后在MmActivity中就可以獲取相應(yīng)信息了
Intent i = getIntent();
Uri uri = i.getData();
System.out.println(uri);//結(jié)果為 mm://abcd
注意點(diǎn)
當(dāng)需要使自定義模式和內(nèi)置模式web,phone等一起被識(shí)別時(shí)兼犯,一定要先聲明內(nèi)置模式忍捡,然后再聲明自定義模式集漾,而且不能在xml中通過autoLink屬性聲明切黔,否則自定義模式不起作用。因?yàn)樵谠O(shè)置內(nèi)置模式時(shí)具篇,會(huì)先刪除已有模式纬霞。
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");//這一句一定要在后面
}
現(xiàn)在就可以同時(shí)識(shí)別web以及自定義模式了。