優(yōu)雅的獲取TextView用戶點(diǎn)擊的鏈接

場(chǎng)景

相信大家有遇到過,當(dāng)你的TextView中有一個(gè)可點(diǎn)擊鏈接時(shí),怎么獲取這段用戶點(diǎn)擊的鏈接?


今天我不們講解ClickableSpan,而是用更優(yōu)雅的方式去實(shí)現(xiàn)


原理

雖然這段內(nèi)容的核心標(biāo)題是原理,但這里我先問幾個(gè)問題?

  1. TextView本身支持哪幾種鏈接形式?
  2. 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

layout code

Java Code

java code

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

result


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è)試下,可以增加印象。

最后希望此文章能幫助到你

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容