最近開發(fā)類似微信朋友圈的點贊列表术徊,每一個用戶名稱一個類似超級鏈接的形式,中間用逗號分割宝磨,而且用戶名還需要點擊事件弧关。第一時間想到的當然是使用Textview
,如果用多個Textview
排列起來唤锉,做起來會很臃腫世囊。那么如何實現(xiàn)呢?
使用SpannableString和SpannableStringBuilder
其實使用SpannableString
和SpannableStringBuilder
一個Textview
就可以實現(xiàn)這樣的需求窿祥。
我們知道使用textview.setText("12345678字符串")
可以設(shè)置文本株憾,但這個方法的參數(shù)類型不是String
,而是一個接口CharSequence
,當然String
是實現(xiàn)了這個接口的晒衩,所以可以傳入嗤瞎。
同樣SpannableString
和SpannableStringBuilder
也是實現(xiàn)了CharSequence
接口,所以我們可以使用這兩個對象代替String
听系。
構(gòu)建SpannableString
SpannableString spannableString = new SpannableString("12345678字符串");//new
textview.setText(spannableString)贝奇;//使用
上面代碼和textview.setText("12345678字符串")
效果是一樣的。
SpannableString
的強大之處在于可以設(shè)置span
,span
意思就是在字符串的一定區(qū)域顯示不同的效果靠胜,如字體顏色掉瞳、背景顏色、點擊時間浪漠、下劃線陕习、字體大小等等等等。址愿。该镣。,以下代碼設(shè)置字符串‘12345’
的背景顏色為#cccccc
,而且具有點擊事件
//點擊效果
ClickableSpan clickableSpan = new ClickableSpan() {
@Override
public void onClick(View widget) {
//這里處理點擊事件
}
};
//背景顏色
BackgroundColorSpan bs =new BackgroundColorSpan(Color.parseColor("#CCCCCC");
//下面兩個效果的疊加的响谓,不回覆蓋
spannableString.setSpan(clickableSpan,0,4,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
spannableString.setSpan(bs,0,4,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
textview.setText(spannableString)损合;
//加上這句才會有點擊響應(yīng)。娘纷。
textview.setMovementMethod(LinkMovementMethod.getInstance());
setSpan的參數(shù):setSpan(Object what, int start, int end, int flags)
塌忽,其中flags可以是以下的值:
-
Spanned.SPAN_EXCLUSIVE_INCLUSIVE
:在 Span前面輸入的字符不應(yīng)用 Span的效果,在后面輸入的字符應(yīng)用Span效果失驶。 -
Spanned.SPAN_INCLUSIVE_EXCLUSIVE
:在 Span前面輸入的字符應(yīng)用 Span 的效果土居,在后面輸入的字符不應(yīng)用Span效果。 -
Spanned.SPAN_INCUJSIVE_INCLUSIVE
:在 Span前后輸入的字符都應(yīng)用 Span 的效果。
setSpan
方法設(shè)置一個span對象擦耀,它的參數(shù)類型是Object
棉圈,已知可用的類有:
類/接口名 | 說明 |
---|---|
BackgroundColorSpan | 背景色 |
ClickableSpan | 文本可點擊,有點擊事件 |
ForegroundColorSpan | 文本顏色(前景色) |
MaskFilterSpan | 修飾效果眷蜓,如模糊(BlurMaskFilter)浮雕 |
(EmbossMaskFilter)MetricAffectingSpan | 父類分瘾,一般不用 |
RasterizerSpan | 光柵效果 |
StrikethroughSpan | 刪除線(中劃線) |
SuggestionSpan | 相當于占位符 |
UnderlineSpan | 下劃線 |
AbsoluteSizeSpan | 絕對大小(文本字體) |
DynamicDrawableSpan | 設(shè)置圖片吁系,基于文本基線或底部對齊德召。 |
ImageSpan | 圖片 |
RelativeSizeSpan | 相對大小(文本字體) |
ReplacementSpan | 父類汽纤,一般不用 |
ScaleXSpan | 基于x軸縮放 |
StyleSpan | 字體樣式:粗體上岗、斜體等 |
SubscriptSpan | 下標(數(shù)學公式會用到) |
SuperscriptSpan | 上標(數(shù)學公式會用到) |
TextAppearanceSpan | 文本外貌(包括字體、大小蕴坪、樣式和顏色) |
TypefaceSpan | 文本字體 |
URLSpan | 文本超鏈接 |
怎么使用可以一個個試過去
SpannableString和SpannableStringBuilder的關(guān)系
有點類似與String
和StringBuilder
SpannableString
是不可變長度的
SpannableStringBuilder
是可變長度的
用法上都差不多肴掷,復(fù)雜效果組合使用更加方便快捷,它們可以這樣組合:
SpannableStringBuilder ssb = new SpannableStringBuilder("嘿嘿");
SpannableString ss1 = new SpannableString("①號");
SpannableString ss2 = new SpannableString("②號");
ssb.append(ss1);
ssb.append(ss2);
ssb.append("也可以是字符串");