天天看點

Android TextView 中實作部分文字變色以及點選事件

#

首先要想實作文字變色以及點選,都需要使用到SpannableStringBuilder,執行個體化該類也很簡單,隻需将你想要處理的字元串當做參數

#

那麼下邊便是開始實作文字變色了,調用SpannableStringBuilder的setSpan方法,該方法有四個參數:

你要設定的顔色

需要變色文字開始的Index

需要變色文字結束的index

這個參數描述文字較多

Spanned.SPAN_EXCLUSIVE_EXCLUSIVE,這是在 setSpan 時需要指定的 flag,它的意義我試了很久也沒試出來,睡個覺,今天早上才突然有點想法,試之,果然。它是用來辨別在 Span 範圍内的文本前後輸入新的字元時是否把它們也應用這個效果。分别有 Spanned.SPAN_EXCLUSIVE_EXCLUSIVE(前後都不包括)、Spanned.SPAN_INCLUSIVE_EXCLUSIVE(前面包括,後面不包括)、Spanned.SPAN_EXCLUSIVE_INCLUSIVE(前面不包括,後面包括)、Spanned.SPAN_INCLUSIVE_INCLUSIVE(前後都包括)。
           
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這個方法,但第一個參數換成我們繼承ClickableSpan類的執行個體化,其它三個參數同上,需要注意的是setMovementMethod這個方法一定要記得設定,不然點選是不會生效的

//這個一定要記得設定,不然點選不生效
textView.setMovementMethod(LinkMovementMethod.getInstance());
spannable.setSpan(new TextClick(),startIndex,endIndex , Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
           

那麼接下來出現了一個問題,我既要讓文字可點選,但是又要指定它的顔色該怎麼辦呢。我們檢視ClickableSpan的源碼會發現,它除了onClick之外,還有updateDrawState

@Override 
public void updateDrawState(TextPaint ds) { 
    ds.setColor(ds.linkColor); 
    ds.setUnderlineText(true); 
}
           

它的實作很簡單,一目了然,就是設定文字顔色以及是否有下劃線。那麼這個問題就迎刃而解了,在我們的TextClick重寫updateDrawState,即是

private class TextClick extends ClickableSpan{ 
@Override 
public void onClick(View widget) { 
     //在此處理點選事件
 } 
@Override
 public void updateDrawState(TextPaint ds) { 
      ds.setColor(Color.RED);
    } 
}