我們知道,在布局文件中設置textview的autolink及其類型,這時textivew上會顯示link的顏色,並且文字下面會有一條下划線,表示可以點擊。而在我們在點擊textview時,應用將根據我們所設置的類型跳轉到對應的界面。但是有時,我們因界面需求,需要去掉界面上顯示的下划線,並保持功能不變。
如果已經設置了autolink,那么在textview當中再去設置TextPaint為無下划線是無效的,我們可以看URLSpan所繼承的類ClickableSpan類的源碼,如下:
public abstract class ClickableSpan extends CharacterStyle implements UpdateAppearance { /** * Performs the click action associated with this span. */ public abstract void onClick(View widget); /** * Makes the text underlined and in the link color. */ @Override public void updateDrawState(TextPaint ds) { ds.setColor(ds.linkColor); ds.setUnderlineText(true); } }
可以看到在這里它是重新設置為有下划線的。
所以要解決這個問題,就只有再設置一個沒有下划線的Spannable對象。
首先,繼承一個CharacterStyle或其已實現的子類,重寫updateDrawState方法,代碼如下:
/* * Date: 14-9-4 * Project: Access-Control-V2 */ package cn.irains.access.v2.common; import android.text.TextPaint; import android.text.style.UnderlineSpan; /** * 無下划線的Span * Author: msdx (645079761@qq.com) * Time: 14-9-4 上午10:43 */ public class NoUnderlineSpan extends UnderlineSpan { @Override public void updateDrawState(TextPaint ds) { ds.setColor(ds.linkColor); ds.setUnderlineText(false); } }
然后在textview設置了內容之后,調用以下的代碼,設置一個span:
NoUnderlineSpan mNoUnderlineSpan = new NoUnderlineSpan(); if (textview.getText() instanceof Spannable) { Spannable s = (Spannable) textview.getText(); s.setSpan(mNoUnderlineSpan, 0, s.length(), Spanned.SPAN_MARK_MARK); }
如果你是在listview中使用,並且用了holder,則span對象創建一個就可以了,然后在調用了setText之后再重新設置一遍span。這樣textview在界面上就不會有下划線了,但卻保留着autolink的功能。