- 首先要想實現(xiàn)文字變色以及點擊,都需要使用到SpannableStringBuilder,實例化該類也很簡單,只需將你想要處理的字符串當做參數(shù)
SpannableStringBuilder spannable = new SpannableStringBuilder(content);
- 那么下邊便是開始實現(xiàn)文字變色了,調(diào)用SpannableStringBuilder的setSpan方法,該方法有四個參數(shù):
- 你要設置的顏色
- 需要變色文字開始的Index
- 需要變色文字結(jié)束的index
- 這個參數(shù)描述文字較多,我就不贅述了點擊查看
spannable.setSpan(newForegroundColorSpan(Color.RED),startIndex,endIndex,Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
textView.setText(spannable);
- 接下來是指定文字的點擊事件設置,步驟與設置文字變色基本相同,只需要ClickableSpan這個類來處理點擊事件,我們先寫一個類,繼承ClickableSpan
private class TextClick extends ClickableSpan{ @Override public void onClick(View widget) { //在此處理點擊事件 } } - 接下來又是setSpan這個方法,但第一個參數(shù)換成我們繼承ClickableSpan類的實例化,其它三個參數(shù)同上,需要注意的是setMovementMethod這個方法一定要記得設置,不然點擊是不會生效的
//這個一定要記得設置,不然點擊不生效
textView.setMovementMethod(LinkMovementMethod.getInstance());
spannable.setSpan(new TextClick(),startIndex,endIndex , Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
- 那么接下來出現(xiàn)了一個問題,我既要讓文字可點擊,但是又要指定它的顏色該怎么辦呢。我們查看ClickableSpan的源碼會發(fā)現(xiàn),它除了onClick之外,還有updateDrawState
@Override
public void updateDrawState(TextPaint ds) {
ds.setColor(ds.linkColor);
ds.setUnderlineText(true);
}
- 它的實現(xiàn)很簡單,一目了然,就是設置文字顏色以及是否有下劃線。那么這個問題就迎刃而解了,在我們的TextClick重寫updateDrawState,即是
private class TextClick extends ClickableSpan{
@Override
public void onClick(View widget) {
//在此處理點擊事件
}
@Override
public void updateDrawState(TextPaint ds) {
ds.setColor(Color.RED);
}
}
-
下邊加一張簡單的效果圖
- 至此,問題就全部解決了!
- Demo 下載地址
補充:關于想去掉點擊后文字背景,設置一下HighlightColor即可android:textColorHighlight="#00ffffff"或textView.setHighlightColor(Color.parseColor("#00ffffff"));
PS:如果后續(xù)有時間,我會封裝一個該功能的控件放上來。
時隔3年后續(xù)來了 =-=
已發(fā)布library
詳見github
https://github.com/CuiZhaoHui/SpannableHelper
