TextView的內(nèi)部鏈接與onClick事件沖突

在一個TextView內(nèi)顯示富態(tài)文本功茴,例如指定文本的顏色庐冯、鏈接孽亲、大小等等

詳見:TextView使用SpannableString設(shè)置復(fù)合文本

常用的如:Android使用TextView實現(xiàn)無下劃線超鏈接

一般加入鏈接地址是直接Html.fromHTML(str)或者使用URLSpan,如下:

[java]view plaincopy

print?

String?str?="浪人風(fēng)子";

SpannableString?spanText?=newSpannableString(str?+"?——CSDN");

spanText.setSpan(newURLSpan("http://blog.csdn.net/langrenfengzi"),0,?str.length(),?Spannable.SPAN_INCLUSIVE_EXCLUSIVE);

textView.setText(spanText);

textView.setMovementMethod(newLinkMovementMethod());

這樣顯示的應(yīng)該是這樣帶有下劃線:浪人風(fēng)子——CSDN

對鏈接自動添加下劃線及顏色略有不同展父。

繼承URLSpan類返劲,覆寫updateDrawState方法:

[java]view plaincopy

print?

/**

*

*?沒有下劃線的URLSpan

*

*/

publicclassURLSpanWithoutUnderLineextendsURLSpan?{

privateintcolor?=0xff000000;

publicURLSpanWithoutUnderLine(String?url,intcolor)?{

super(url);

this.color?=?color;

}

publicURLSpanWithoutUnderLine(String?url)?{

super(url);

}

publicURLSpanWithoutUnderLine(Parcel?src)?{

super(src);

}

publicvoidsetColor(intcolor){

this.color??=?color;

}

@Override

publicvoidupdateDrawState(TextPaint?ds)?{

ds.setUnderlineText(false);//去掉下劃線

ds.setColor(color);//改成指定顏色

}

}

[java]view plaincopy

print?

String?str?="浪人風(fēng)子";

SpannableString?spanText?=newSpannableString(str?+"?——CSDN");

spanText.setSpan(newURLSpanWithoutUnderLine("http://blog.csdn.net/langrenfengzi",?Color.BLUE),0,?str.length(),?Spannable.SPAN_INCLUSIVE_EXCLUSIVE);

textView.setText(spanText);

textView.setMovementMethod(newLinkMovementMethod());

這樣就實現(xiàn)了藍色文字無下劃線帶鏈接的文字:浪人風(fēng)子——CSDN

如果給TextView設(shè)置帶點擊事件OnClickListener,發(fā)現(xiàn)當(dāng)點擊鏈接的時候栖茉,點擊事件也會被調(diào)用篮绿。

[java]view plaincopy

print?

textView.setOnClickListener(newView.OnClickListener()?{

@Override

publicvoidonClick(View?v)?{

Log.d("test","onClick.");

}

});

我們想要實現(xiàn)的是當(dāng)點擊鏈接文字的時候只跳轉(zhuǎn)鏈接不觸發(fā)點擊事件,當(dāng)點擊其他位置的時候只觸發(fā)點擊事件吕漂。

繼承LinkMovementMethod類亲配,重寫onTouchEvent方法,使用一個flag標(biāo)志何時點擊了鏈接惶凝。

另外需要對TextView進行自定義控件吼虎,當(dāng)flag標(biāo)志的時候屏蔽點擊事件。

[java]view plaincopy

print?

publicclassCommentTextViewextendsTextView?{

publicbooleanlinkHit;//內(nèi)部鏈接是否被點擊

publicCommentTextView(Context?context)?{

super(context);

}

publicCommentTextView(Context?context,?AttributeSet?attrs)?{

super(context,?attrs);

}

publicCommentTextView(Context?context,?AttributeSet?attrs,intdefStyle)?{

super(context,?attrs,?defStyle);

}

@Override

publicbooleanperformClick()?{

if(linkHit){

returntrue;

}

returnsuper.performClick();

}

@Override

publicbooleanonTouchEvent(MotionEvent?event)?{

linkHit?=false;

returnsuper.onTouchEvent(event);

}

}

參考:http://www.cnblogs.com/TerryBlog/archive/2013/04/02/2994815.html

http://stackoverflow.com/questions/8558732/listview-textview-with-linkmovementmethod-makes-list-item-unclickable

[java]view plaincopy

print?

publicclassCustomLinkMovementMethodextendsLinkMovementMethod?{

staticCustomLinkMovementMethod?sInstance;

@Override

publicbooleanonTouchEvent(TextView?widget,?Spannable?buffer,

MotionEvent?event)?{

intaction?=?event.getAction();

if(action?==?MotionEvent.ACTION_UP?||

action?==?MotionEvent.ACTION_DOWN)?{

intx?=?(int)?event.getX();

inty?=?(int)?event.getY();

x?-=?widget.getTotalPaddingLeft();

y?-=?widget.getTotalPaddingTop();

x?+=?widget.getScrollX();

y?+=?widget.getScrollY();

Layout?layout?=?widget.getLayout();

intline?=?layout.getLineForVertical(y);

intoff?=?layout.getOffsetForHorizontal(line,?x);

ClickableSpan[]?link?=?buffer.getSpans(off,?off,?ClickableSpan.class);

if(link.length?!=0)?{

if(action?==?MotionEvent.ACTION_UP)?{

link[0].onClick(widget);

}elseif(action?==?MotionEvent.ACTION_DOWN)?{

Selection.setSelection(buffer,

buffer.getSpanStart(link[0]),

buffer.getSpanEnd(link[0]));

}

if(widgetinstanceofCommentTextView){

((CommentTextView)widget).linkHit?=true;

}

returntrue;

}else{

Selection.removeSelection(buffer);

super.onTouchEvent(widget,?buffer,?event);

returnfalse;

}

}

returnTouch.onTouchEvent(widget,?buffer,?event);

}

publicstaticCustomLinkMovementMethod?getInstance()?{

if(sInstance?==null){

sInstance?=newCustomLinkMovementMethod();

}

returnsInstance;

}

}

CustomLinkMovementMethod的onTouchEvent基本拷貝LinkMovementMethod里對應(yīng)方法的內(nèi)容苍鲜,需要修改的部分用為當(dāng)有點擊鏈接的時候設(shè)置flag變量linkHit.

另外切記思灰,務(wù)必要重寫靜態(tài)方法getInstance(), 否則會調(diào)用父類的getInstance()實現(xiàn)混滔,繼而調(diào)用父類的onTouchEvent方法洒疚,實則沒起作用。

在CommentTextView的onTouchEvent方法中的super.onTouchEvent(event)方法中會自動調(diào)用CustomLinkMovementMethod的onTouchEvent()方法坯屿,然后修改linkHit的值油湖。

在performClick中判斷,當(dāng)linkHit為true的時候领跛,直接返回true, 屏蔽調(diào)后續(xù)的onClickListener里的實現(xiàn)乏德。

最終這樣來調(diào)用:

[java]view plaincopy

print?

CommentTextView?textView?=newCommentTextView(this);

String?str?="浪人風(fēng)子";

SpannableString?spanText?=newSpannableString(str?+"?——CSDN");

spanText.setSpan(newURLSpanWithoutUnderLine("http://blog.csdn.net/langrenfengzi",?Color.BLUE),0,?str.length(),?Spannable.SPAN_INCLUSIVE_EXCLUSIVE);

textView.setText(spanText);

textView.setMovementMethod(CustomLinkMovementMethod.getInstance());


http://blog.csdn.net/langrenfengzi/article/details/39395567

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市隔节,隨后出現(xiàn)的幾起案子鹅经,更是在濱河造成了極大的恐慌寂呛,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件瘾晃,死亡現(xiàn)場離奇詭異贷痪,居然都是意外死亡,警方通過查閱死者的電腦和手機蹦误,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進店門劫拢,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人强胰,你說我怎么就攤上這事舱沧。” “怎么了偶洋?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵熟吏,是天一觀的道長。 經(jīng)常有香客問我玄窝,道長牵寺,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任恩脂,我火速辦了婚禮帽氓,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘俩块。我一直安慰自己黎休,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布玉凯。 她就那樣靜靜地躺著势腮,像睡著了一般。 火紅的嫁衣襯著肌膚如雪壮啊。 梳的紋絲不亂的頭發(fā)上嫉鲸,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天,我揣著相機與錄音歹啼,去河邊找鬼玄渗。 笑死,一個胖子當(dāng)著我的面吹牛狸眼,可吹牛的內(nèi)容都是我干的藤树。 我是一名探鬼主播,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼拓萌,長吁一口氣:“原來是場噩夢啊……” “哼岁钓!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤屡限,失蹤者是張志新(化名)和其女友劉穎品嚣,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體钧大,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡翰撑,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了啊央。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片眶诈。...
    茶點故事閱讀 38,039評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖瓜饥,靈堂內(nèi)的尸體忽然破棺而出逝撬,到底是詐尸還是另有隱情,我是刑警寧澤乓土,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布宪潮,位于F島的核電站,受9級特大地震影響帐我,放射性物質(zhì)發(fā)生泄漏坎炼。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一拦键、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧檩淋,春花似錦芬为、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至日戈,卻和暖如春询张,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背浙炼。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工份氧, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人弯屈。 一個月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓蜗帜,卻偏偏與公主長得像,于是被迫代替她去往敵國和親资厉。 傳聞我的和親對象是個殘疾皇子厅缺,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,786評論 2 345

推薦閱讀更多精彩內(nèi)容