經(jīng)常在工作中經(jīng)常會遇到一段文字中為了突出某個特定詞語而要將其顏色秩霍,大小,粗細等設置成和其他字體不一樣的問題捶码。剛開始不知道SpannableString的時候自己能想到的解決辦法是將文字分成三個textview在放置磨德,將需要突出的詞語專門放入到一個textview中來對其設置一些屬性矿筝。這種辦法不僅笨重,而且布局調節(jié)起來也麻煩念脯。
而SpannableString解決起這個問題就變的非常簡單了狞洋,它可以直接的指定一段話中的某些關鍵字變成自己想要的樣式。
用法如下:
SpannableString spannableString = new SpannableString(text);
spannableString.setSpan(span, 0, text.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
textview.setText(spannableString);
- text 為一段文字
- setSpan(Object what, int start, int end, int flags)方法
- what 代表一個行為绿店,改變顏色吉懊,字體加粗,設置大小等等
- start假勿,end代表what行為的起始位置
- flag是一個標識借嗽,固定的用 Spanned.SPAN_EXCLUSIVE_EXCLUSIVE,其他的參數(shù)可以參考
what的方法在網(wǎng)上可以搜索到很多转培,列舉一下自己經(jīng)常會用的一些:
- new ForegroundColorSpan(Color.RED) 設置字符顏色
- new BackgroundColorSpan(Color.RED) 設置背景顏色
- new StyleSpan() arg: Typeface.NORMAL,Typeface.BOLD,Typeface.ITALIC,Typeface.BOLD_ITALIC 設置字體粗細
- new UnderlineSpan() 設置下劃線
- new URLSpan("sms:10086") 設置發(fā)送短信
- new URLSpan("http://www.hao123.com") 設置打開網(wǎng)頁
- new URLSpan("tel:4155551212") 設置打電話
- new ClickableSpan 設置點擊事件
在項目中使用時所遇到的“坑”
- 首先第一個要說的就是 setMovementMethod(LinkMovementMethod.getInstance())這個設置恶导,因為如果你對文字設置了URLSpan("sms:10086"),URLSpan("http://www.hao123.com") 浸须,URLSpan("tel:4155551212")惨寿,ClickableSpan這四個中的任何一個方法的時候就需要對自己的textview設置setMovementMethod(LinkMovementMethod.getInstance())方法,否則這四個方法會失效
- textview.setText(spannableString)時不能加"\n","\b"等字符删窒,若想換行之類的可以textview.append("\n"),不能textview.setText(spannableString+"\n")
- 一個spannableString同時設置了URLSpan("http://www.baidu.com")缤沦,
ForegroundColorSpan(Color.RED)屬性時,要先設置URL易稠,后設置ForegroundColorSpan缸废。因為URL自帶顏色若設置在ForegroundColorSpan后面的時候,則ForegroundColorSpan設置的顏色會失效。
new ClickableSpan 需要重寫兩個方法 updateDrawState()和 onClick()
*updateDrawState()用來設置文字屬性
*onClick()用來設置文字點擊事件
最后放上一個SpannyUtils.java:
<pre><code>
import android.text.SpannableString;
import android.text.Spanned;
public class SpannyUtils {
/*
* Span lists:
*
* 1.new TypefaceSpan() arg: "monospace", "serif", and "sans-serif".
*
* 2.new ForegroundColorSpan() arg: int color
*
* 3.new BackgroundColorSpan() arg: int color
*
* 4.new StyleSpan() arg: Typeface.NORMAL,Typeface.BOLD,Typeface.ITALIC,Typeface.BOLD_ITALIC
*
* 5.new UnderlineSpan()
*
* 6.new StrikethroughSpan()
*
* 7.new URLSpan() arg: String Url
*
* 8.new ClickableSpan()
*
* */
public static SpannableString spanText(CharSequence text, Object... spans) {
SpannableString spannableString = new SpannableString(text);
for (Object span : spans) {
spannableString.setSpan(span, 0, text.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
}
return spannableString;
}
public static SpannableString spanText(CharSequence text, Object span) {
SpannableString spannableString = new SpannableString(text);
spannableString.setSpan(span, 0, text.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
return spannableString;
}
}