????????相信很多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()方法。
但由于我的需求里面 有下劃線的那幾個字是有額外的點擊事件的蝉揍,要想同時擁有點擊和下劃線又沾,只能這么寫(也可能是我還沒有找到更好的)捍掺。