場(chǎng)景.
? ? ? ? 最近在寫個(gè)小頁(yè)面的時(shí)候ListView下有很多富文本,例如新聞鏈接书妻,關(guān)鍵字加黑以及股票代碼斜體并能跳轉(zhuǎn)到個(gè)股行情等等功能船响。思索片刻,毫不猶豫的決定使用一個(gè)功能強(qiáng)大的富文本處理類--SpannableStringBuilder躲履,真的挺好用见间。 然后,我們會(huì)遇到這樣一個(gè)問(wèn)題——文本中的鏈接是可以點(diǎn)進(jìn)工猜,然而對(duì)應(yīng)的ItemOnClick卻再也不靈了米诉。這是為什么呢?
思路.
? ? ? ? 遇到問(wèn)題其實(shí)并不可怕域慷,反而應(yīng)該慶幸荒辕,因?yàn)槲覀兺茉趩?wèn)題中學(xué)習(xí)很多新的東西,也會(huì)加深對(duì)某個(gè)知識(shí)點(diǎn)的理解犹褒。首先由表及里的分析一波抵窒,從現(xiàn)象上看明顯是OnItemClickListener監(jiān)聽無(wú)效,也就是斷點(diǎn)到onItemClick()方法體不會(huì)執(zhí)行叠骑。tv.setMovementMethod(LinkMovementMethod.getInstance());問(wèn)題就出現(xiàn)在這句代碼上李皇,下面我們看看這段代碼到底做了啥?
因此宙枷,由圖2-1標(biāo)記處知掉房,這句代碼執(zhí)行后TextView的焦點(diǎn)沒(méi)有取消,那么如何在點(diǎn)擊后取消掉呢慰丛?或者卓囚,判斷是真正點(diǎn)擊到跳轉(zhuǎn)處,才消費(fèi)掉監(jiān)聽事件诅病;否則不做處理哪亿,繼續(xù)返回上一層的onItemClickListener粥烁。
那么我們?cè)倏碝ovementMethod單例類中又做了啥?OnTouchEvent方法中蝇棉,代碼片段如下:
如果在這里對(duì)點(diǎn)擊事件進(jìn)行攔截讨阻,并做相應(yīng)的判斷是否消費(fèi)點(diǎn)擊事件,就可以避免監(jiān)聽事件的沖突問(wèn)題篡殷。
解決方案.
既然知道原因了钝吮,那么總有解決的辦法,有以下兩個(gè)通用的解決方案:
第一種:對(duì)癥下藥板辽,通過(guò)Google搜索奇瘦,在StackOverflow上有這樣一個(gè)提問(wèn):ListView: TextView with LinkMovementMethod makes list item unclickable? 某些大神給出以下兩種解決辦法:一種是:自定義個(gè)TextView控件,然后修改一下LinkMovementMethod單例類戳气,本方法比較通用链患;另一種:在TextView上添加onTouchListener監(jiān)聽,重寫onTouch方法瓶您,同樣是異曲同工之妙。這兩種方法本質(zhì)上是其實(shí)沒(méi)有什么區(qū)別的纲仍。具體的代碼就不貼出來(lái)了呀袱,隨后的demo中也有相應(yīng)的實(shí)現(xiàn)。
第二種:?jiǎn)渭儚谋硐笕胧种5热晃覀冎懒薚extView中的監(jiān)聽事件是沒(méi)有問(wèn)題的夜赵,那么我們完全可以判斷出是不是真正點(diǎn)擊到跳轉(zhuǎn)的位置,如果是則isClick標(biāo)志位為ture乡革,否則false寇僧;為false時(shí)我們?nèi)?zhí)行onItemClick方法即可,這樣是不是也把問(wèn)題解決了沸版?
總結(jié).
活用谷歌搜索嘁傀,它是解決開發(fā)中遇到問(wèn)題的一大助力。剛開始嘗試著寫點(diǎn)總結(jié)视粮,總結(jié)的不到之處還請(qǐng)多多指教细办。Demo地址: