實際上這個問題百度一大堆,但是你不一定能找到真正好的
這篇博文寫的就是好的,站在巨人的肩上,借鑒注明出處。
SO
了解到的方法有兩種,一種是設(shè)置span,一種是讓TextView顯示網(wǎng)頁格式。
一般來說,我們調(diào)用一個TextView的setText();方法時,傳入的是一個String對象,這樣TextView就會幫我們把字符串展示出來,而實際上,

setText傳入的是一個CharSequence,而String實現(xiàn)了CharSequence,所以可以作為參數(shù)設(shè)置進來,同樣道理,這兩種能改變字符樣式的方法,用到的類也是CharSequence的子類或者實現(xiàn)類,只不過他比String,多了能改變樣式的特性。
方法一,設(shè)置字符樣式
會用到SpannableString和SpannableStringBuilder來取代String
SpannableString 和 SpannableStringBuilder的區(qū)別是SpannableString 需要一次性傳入字符構(gòu)造,并且不允許更改添加字符
SpannableString spanString = new SpannableString("這是測試文本");
而SpannableStringBuilder和StringBuilder一樣,是可以使用append拼接字符串的。
SpannableStringBuilder builder = new SpannableStringBuilder();
builder.append("字符一");
builder.append("字符二");
builder.append("字符三");
接著是SpannableString 和 SpannableStringBuilder的
setSpan(Object?what,int start,int end,int flags)方法
四個參數(shù)
Object what: 設(shè)置的span類型,顏色,粗體,下劃線等等
int start: 開始作用的索引,包括start,索引從0開始
int end: span結(jié)束作用的索引,不包括end
int flags: 有四個取值,分別表示是否作用于span范圍前后新增的字符
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE,前后都不作用
Spannable.SPAN_EXCLUSIVE_INCLUSIVE,后面作用
Spannable.SPAN_INCLUSIVE_EXCLUSIVE,前面作用
Spannable.SPAN_INCLUSIVE_INCLUSIVE,前后都作用
可以這樣區(qū)分,SPAN之后第一個字母是前,第二個字母是后,EXCLUSIVE不包括,INCLUSIVE包括.
舉個例子
SpannableStringBuilder builder = new SpannableStringBuilder();
builder.append("字符一");
builder.append("字符二");
builder.append("字符三");
ForegroundColorSpan span = new ForegroundColorSpan(Color.rgb(254,58,54));
builder.setSpan(span, 2, 4, Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
edit.setText(builder);


可以看到,索引2,4,作用的是下標(biāo)為2,3的字符,而設(shè)置flag設(shè)置為Spannable.SPAN_INCLUSIVE_EXCLUSIVE的效果,“一字”之前添加的字符是同樣會被樣式作用的,而之后的字符是不會的。
關(guān)于Span類型
字體顏色
SpannableString spanString = new SpannableString("這是測試文本");
ForegroundColorSpan span = new ForegroundColorSpan(Color.rgb(254,58,54));
spanString.setSpan(span, 2, 4, Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
tv.setText(spanString);

構(gòu)建ForegroundColorSpan時需要傳入一個顏色的int值,可以選用android自帶的Color下的顏色,也可以用自定義在color.xml里的顏色,也可以像上面寫的用Color.rgb去解析一個顏色,RGB值可以用拾色器去取,一般用第二種了,比較規(guī)范,這里是試試第三種行不行忘了改回來。
關(guān)于其他的span,還有
字體的背景顏色:BackgroundColorSpan
字體大小:AbsoluteSizeSpan
AbsoluteSizeSpan span = new AbsoluteSizeSpan(11);
注意一下,設(shè)置的是像素值。
粗體,斜體 : StyleSpan
StyleSpan styleSpan = new StyleSpan(Typeface.BOLD);
可以看到,參數(shù)是Typeface下的常量,而Typeface下有各種參量。SERIF之類的,能用的只有粗體和斜體。


可以看到,構(gòu)造函數(shù)告訴我們參數(shù)是TypeFace下的常量,而Typeface下有個很友好的提示Style指示這四個常量,不用擔(dān)心會用到別的常量,因為你不填這四個,構(gòu)造函數(shù)是會報錯的。
刪除線 :StrikethroughSpan
下劃線 :UnderlineSpan
圖文置換:ImageSpan 把文字替換成圖片,感覺實用性不大,有需要就看看上面提到的那篇博文。
總結(jié)一下
首先用SpannableString 和 SpannableStringBuilder構(gòu)建你的字符串,挑選自己需要的span,把span設(shè)置到字符串里,最后把字符串設(shè)置到TextView中。
方法二
讓TextView顯示html的標(biāo)簽樣式
例如:


調(diào)用Html.fromHtml去解析一個包含html標(biāo)簽的String字符串,該方法返回一個Spanned對象,Spanned是CharSequence的子類。
需要主意的是,String 里的html標(biāo)簽用到雙引號,要用轉(zhuǎn)移字符
其次是fromHtml這個方法,上面可以看到是個過時的方法,代替方法是
fromHtml(String source, int flags)
有個flags,實際上這個過時方法也有一個flags
@Deprecated
public static Spanned fromHtml(String source) {
return fromHtml(source, FROM_HTML_MODE_LEGACY, null, null);
}
FROM_HTML_MODE_LEGACY ?。android N 之前留下的特性,遇到塊級元素就會換行,也就是說html標(biāo)簽里的<p>,<h1>之類的標(biāo)簽,會自動換行
回到文章來說,如果是只改變顏色,那只會用到<font color>這個標(biāo)簽。不用在意這個flags
如果硬要展示各種標(biāo)簽,而且對flags有要求,可以去Html這個類里看看其他幾個flags能不能滿足要求。太復(fù)雜的網(wǎng)頁,還是用WebView展示吧。
所以。這就是改變字體顏色的兩種方法了~