1.介紹
我們在開發(fā)過程經(jīng)常會遇到一些在TextView上需要顯示不同顏色的文字、文字中加入URL、文件中加入圖片或者對某段文字加入點擊事件等這樣的需求時。我們以前一般的做法是會在一個布局中寫多個控件然后根據(jù)需求來布局XML,這種方法本身沒有什么毛病但是我們可以采用更加好的方案來實現(xiàn)這種需求,現(xiàn)在我們就來學習下SpannableStringBuilder這個類的用法完后就可以優(yōu)雅的實現(xiàn)這類需求了。
SpannableStringBuilder 一般配合 SpannableString 使用就和String 和 StringBuilder一樣前者可以拼接后者不能拼接。
Class Overview
This is the class for text whose content and markup can both be changed. /這類文本的內(nèi)容和標記都可以改變/
-
常用公有方法
常用公有方法
- 重點方法 void setSpan(Object what, int start, int end, int flags)
what 可用于如下圖片中的類
start 文本開始的位置
end 文本結束的位置
flags 是一個標記
Spanned.SPAN_EXCLUSIVE_INCLUSIVE:
在 Span前面輸入的字符不應用 Span的效果,在后面輸入的字符應用Span效果。
Spanned.SPAN_INCLUSIVE_EXCLUSIVE:
在 Span前面輸入的字符應用 Span 的效果,在后面輸入的字符不應用Span效果。
Spanned.SPAN_INCUJSIVE_INCLUSIVE:
在 Span前后輸入的字符都應用 Span 的效果。
what參數(shù)可以作用的類型

what參數(shù)
2.使用過程
/**
* 設置文本顏色
* @param text 需要改變顏色的text
* @return
*/
public SpannableString style1(String text) {
SpannableString sbs = new SpannableString(text);
ForegroundColorSpan forColor = new ForegroundColorSpan(Color.parseColor("#FF8247"));
sbs.setSpan(forColor, 0, text.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
return sbs;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.spannable_layout);
TextView textView = (TextView) findViewById(R.id.text);
SpannableStringBuilder builder = new SpannableStringBuilder();
builder.append(style1("名字:"));
builder.append("Android TextView中文字通過SpannableString來設置超鏈接、顏色、字體等屬性");
textView.setText(builder);
}

改變名字顏色
/**
* 設置文本背景顏色
* @param text 需要改變顏色的text
* @return
*/
public SpannableString style2(String text) {
SpannableString sbs = new SpannableString(text);
BackgroundColorSpan forColor = new BackgroundColorSpan(Color.parseColor("#FF8247"));
sbs.setSpan(forColor, 0, text.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
return sbs;
}
改變背景顏色代碼
/**
* 在文本中插入image
* @param text 要改變的text
* @return
*/
public SpannableString drawableSpan(String text) {
SpannableString spannableString = new SpannableString(text);
ImageSpan drawableSpan = new ImageSpan(this, R.drawable.christmas_diamond);
//3-5的位置替換為圖片
spannableString.setSpan(drawableSpan, 3, 5, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
return spannableString;
}

在文本中插入圖片
/**
* 設置文本的點擊
* @return
*/
public ClickableSpan clickableSpan() {
ClickableSpan clickableSpan = new ClickableSpan() {
@Override
public void onClick(View widget) {
Toast.makeText(MainActivity.this, "點擊了URL", Toast.LENGTH_SHORT).show();
}
};
return clickableSpan;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.spannable_layout);
TextView textView = (TextView) findViewById(R.id.text);
SpannableStringBuilder builder = new SpannableStringBuilder();
builder.append(style1("Android TextView"));
//0-7下標為可以點擊的文本
builder.setSpan(clickableSpan(), 0, 7, Spanned.SPAN_EXCLUSIVE_INCLUSIVE);
textView.setText(builder);
textView.setMovementMethod(LinkMovementMethod.getInstance());//務必加上這句不然沒效果
}

點擊0-7下標觸發(fā)點擊事件
/**
* 設置文本超鏈接
* @param text 要改變的text
* @return
*/
public SpannableString styleUrl(String text) {
SpannableString spannableString = new SpannableString(text);
URLSpan urlSpan = new URLSpan(“tel:0123456789”);
spannableString.setSpan(urlSpan, 0, text.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
return spannableString;
}
