在一個TextView內(nèi)顯示富態(tài)文本功茴,例如指定文本的顏色庐冯、鏈接孽亲、大小等等
詳見:TextView使用SpannableString設(shè)置復(fù)合文本
常用的如:Android使用TextView實現(xiàn)無下劃線超鏈接
一般加入鏈接地址是直接Html.fromHTML(str)或者使用URLSpan,如下:
[java]view plaincopy
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
/**
*
*?沒有下劃線的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
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
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
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
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
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