記一次SpannableString使用

????????相信很多app在登錄或者注冊頁面會出現(xiàn)下面這個樣式:一行文字 兩個下劃線 兩個點擊事件。偷懶的實現(xiàn) 可能會放三四個textview 然后給其中兩個添加下劃線和點擊事件,但感覺不是很優(yōu)雅,于是就想到了用SpannableString來實現(xiàn)

鱉嗦話,直接上代碼

String text = "登錄/注冊即表示同意鏈會議 服務(wù)條款 和 隱私條款";

? ? ? ? SpannableString spanString = new SpannableString(text);

? ? ? ? ForegroundColorSpan foregroundColorSpan = new ForegroundColorSpan(getResources().getColor(R.color.color_a0a0a0));

? ? ? ? ClickableSpan serviceSpan = new ClickableSpan() {

? ? ? ? ? ? @Override

? ? ? ? ? ? public void onClick(View widget) {

? ? ? ? ? ? }

? ? ? ? };

? ? ? ? UnderlineSpan underlineSpan = new UnderlineSpan(){

? ? ? ? ? ? @Override

? ? ? ? ? ? public void updateDrawState(TextPaint ds) {

? ? ? ? ? ? ? ? ds.setColor(Color.parseColor("#a0a0a0"));

? ? ? ? ? ? ? ? ds.setUnderlineText(true);

? ? ? ? ? ? }

? ? ? ? };

? ? ? ? UnderlineSpan newUnderlineSpan = new UnderlineSpan(){

? ? ? ? ? ? @Override

? ? ? ? ? ? public void updateDrawState(TextPaint ds) {

? ? ? ? ? ? ? ? ds.setColor(Color.parseColor("#a0a0a0"));

? ? ? ? ? ? ? ? ds.setUnderlineText(true);

? ? ? ? ? ? }

? ? ? ? };

? ? ? ? ClickableSpan privacySpan = new ClickableSpan() {

? ? ? ? ? ? @Override

? ? ? ? ? ? public void onClick(View widget) {

? ? ? ? ? ? }

? ? ? ? };

? ? ? ? spanString.setSpan(foregroundColorSpan, 0, text.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

? ? ? ? spanString.setSpan(serviceSpan,14, 18, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

? ? ? ? spanString.setSpan(underlineSpan,14, 18, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

? ? ? ? spanString.setSpan(privacySpan,21, 25, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

? ? ? ? spanString.setSpan(newUnderlineSpan,21, 25, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

? ? ? ? tvProtocol.setText(spanString);

? ? ? ? tvProtocol.setMovementMethod(LinkMovementMethod.getInstance());

因為有好多博主已經(jīng)詳細解說過Spanned的flag 我在這就不廢話了(其實也是自己沒有去研究)

傳送門:其實你不懂:Android之Spanned flag

這里主要記錄一下我在使用中遇到的問題:

眼尖的小伙伴可能發(fā)現(xiàn) 我為啥寫了兩個一樣的添加下劃線的UnderlineSpan,用一個不是還節(jié)省對象的創(chuàng)建嗎?!

最開始 我也是這么想的,但結(jié)果發(fā)現(xiàn)如果兩個共用一個UnderlineSpan對象的話,UnderlineSpan設(shè)置的顏色就會失效。

有人問“為啥你的下劃線還要設(shè)置顏色?”?

其實,單獨設(shè)置下劃線的話,是不需要重寫UnderlineSpan的updateDrawState()方法。

但由于我的需求里面 有下劃線的那幾個字是有額外的點擊事件的,要想同時擁有點擊和下劃線,只能這么寫(也可能是我還沒有找到更好的)。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容