1. 程式人生 > >專案淺談-從SpannableString到ClickableSpan

專案淺談-從SpannableString到ClickableSpan

最近專案有這樣一個需求,需要對一段文字中的部分位置進行點選處理,並且要求這段文字變色且字下加線。

比如:“正文內容點選跳轉,正文內容點選跳轉連結地址需要跳轉了。”像此中“連結地址”處的文案,需要變色、字下加線並相應點選動作,此時你會怎麼實現呢?

方案一:能直接想到的最簡單的辦法就是幾個TextView做拼接,然後給需要特殊處理的TextView做變色及點選等設定。這樣確實可行,但不太好,而且有些狀況下也會無能為力,例如文案特別多的情況下拼湊起來太麻煩,而且如果這個需要變色的文案折行了,那這時的效果就很差了。

那麼有沒有辦法,使用一個TextView,為其部分位置設定字型變色呢?當然有了偷笑

方案二:做過文字特殊處理的同學,可能會想到 SpannableString,沒錯就是它,它和String一樣,都是一種字串型別,而且兩者都實現了

CharSequence,因此TextView可以直接setText(SpannableString),SpannableString可以實現對一段文字的部分位置設定字型顏色、字型大小、下劃線、字型風格等等,但點選事件我們怎麼處理呢,此時還需要一個哥們,ClickableSpan,有了它的幫助,我們就能輕而易舉的實現點選動作了。接下來我們看下繼承關係和程式碼示例吧。

SpannableString

ClickableSpan

程式碼示例如下:

    TextView privacyAgree = view.findViewById(R.id.privacy_agree_content);
    SpannableString ss = new SpannableString(privacyAgree.getText());
    ss.setSpan(clickSpan,4,12,Spanned.SPAN_INCLUSIVE_INCLUSIVE);
    ForegroundColorSpan colorSpan = new ForegroundColorSpan(Color.parseColor("#0099EE")); 
    ss.setSpan(colorSpan,9,ss.length(),Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
    privacyAgree.setText(ss);
    privacyAgree.setMovementMethod(LinkMovementMethod.getInstance());

ClickableSpan:

ClickableSpan clickSpan = new ClickableSpan() {
        @Override
        public void onClick(View widget) {
            //TODO
        }
        @Override
        public void updateDrawState(TextPaint ds) {
            ds.setColor(ContextCompat.getColor(MainActivity.this,R.color.red));
            ds.setUnderlineText(true);
        }
    };

上述程式碼要注意幾點內容:

1,Spanned.SPAN_INCLUSIVE_EXCLUSIVE等幾者的含義:

Spanned.SPAN_INCLUSIVE_EXCLUSIVE 起始下標到終了下標,包括起始下標
Spanned.SPAN_INCLUSIVE_INCLUSIVE 起始下標到終了下標,同時包括起始下標和終了下標
Spanned.SPAN_EXCLUSIVE_EXCLUSIVE 起始下標到終了下標,但都不包括起始下標和終了下標
Spanned.SPAN_EXCLUSIVE_INCLUSIVE 起始下標到終了下標,包括終了下標

2,要想讓點選動作生效,privacyAgree.setMovementMethod(LinkMovementMethod.getInstance()),此行程式碼必不可少。

好了,先簡單的介紹到這裡吧。如有更多需要的地方,可詳細檢視文中提到的SpannableString的其它使用方法。