場(chǎng)景
相信大家有遇到過,當(dāng)你的TextView中有一個(gè)可點(diǎn)擊鏈接時(shí),怎么獲取這段用戶點(diǎn)擊的鏈接?
今天我不們講解ClickableSpan,而是用更優(yōu)雅的方式去實(shí)現(xiàn)
原理
雖然這段內(nèi)容的核心標(biāo)題是原理,但這里我先問幾個(gè)問題?
- TextView本身支持哪幾種鏈接形式?
- TextView的這幾種鏈接形式達(dá)到的效果如果不用TextView怎么去實(shí)現(xiàn)?
TextView本身支持哪幾種鏈接形式?
我們查看android.text.util.Linkify.java類就可以找到答案,支持的有如下幾種:
|類型|效果|
|-|-|
|WEB_URLS(web地址)|點(diǎn)擊會(huì)跳轉(zhuǎn)到瀏覽器并打開此地址|
|EMAIL_ADDRESSES(郵箱地址)|點(diǎn)擊會(huì)跳轉(zhuǎn)到發(fā)郵件界面|
|PHONE_NUMBERS(電話號(hào)碼)|點(diǎn)擊會(huì)跳轉(zhuǎn)到撥號(hào)界面|
|MAP_ADDRESSES(地圖地址)|點(diǎn)擊打開地圖定位到傳入的地址|
不用TextView怎么去實(shí)現(xiàn)這幾個(gè)功能?
1.WEB_URLS
Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.setData(Uri.parse("http://www.google.com"));
startActivity(intent);
2.EMAIL_ADDRESSES
Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.setData(Uri.parse("mailto:qiu.jay892@gmail.com"));
startActivity(intent);
3.PHONE_NUMBERS
Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.setData(Uri.parse("tel:1234567890"));
startActivity(intent);
4.MAP_ADDRESSES
Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.setData(Uri.parse("geo:0,0?q=620+Eighth+Avenue+New+York%2C+NY+10018"));
startActivity(intent);
細(xì)心的朋友可能發(fā)現(xiàn),其實(shí)實(shí)現(xiàn)某一種特定的功能,都有一種特定的協(xié)議,比如:WEB_URLS(http或https)、EMAIL_ADDRESSES(mailto)、PHONE_NUMBERS(tel)、MAP_ADDRESSES(geo)
看到這里,可能有的小伙伴們已經(jīng)猜到了,其實(shí)TextView實(shí)現(xiàn)的鏈接方式達(dá)到的效果就是我們用代碼實(shí)現(xiàn)的方式一樣的,只是做了封裝而已,那既然是通過startActivity來實(shí)現(xiàn)的?那么怎么獲取這個(gè)地址了?
答案很簡(jiǎn)單,在當(dāng)前Activity中重寫startActivity方法,我們想要的數(shù)據(jù)就在此方法中的參數(shù)Intent對(duì)象中了。不信的話我們就試試。
我先給大家看代碼
Layout Code

Java Code

最后發(fā)上實(shí)踐效果圖,看是否toast出來的是不是我們點(diǎn)擊的

PS:圖中點(diǎn)擊了郵件地址彈出了不支持此操作,原因是我的模擬器中沒有郵件應(yīng)用,也就是說,當(dāng)我們的手機(jī)中沒有支持uri的應(yīng)用,系統(tǒng)會(huì)給出提示
自己在TextView渲染了Html<a>標(biāo)簽怎么攔截?
在開發(fā)中,大多數(shù)在TextView中點(diǎn)擊跳轉(zhuǎn)到另外一個(gè)界面的時(shí)候,其實(shí)大家實(shí)現(xiàn)了都是自定義協(xié)議的Uri,這個(gè)時(shí)候能否通過此方法攔截?放心,答案是肯定的,這里就不給大家測(cè)試了,想確認(rèn)的,自己去測(cè)試下,可以增加印象。
最后希望此文章能幫助到你