spannableString和html實現textview設置不同顏色字體點擊事件簡單用法點這裏
1、SpannableString、SpannableStringBuilder與String的關係
首先SpannableString、SpannableStringBuilder基本上與String差不多,也是用來存儲字符串,但它們倆的特殊就在於有一個SetSpan()函數,能給這些存儲的String添加各種格式或者稱樣式(Span),將原來的String以不同的樣式顯示出來,比如在原來String上加下劃線、加背景色、改變字體顏色、用圖片把指定的文字給替換掉,等等。所以,總而言之,SpannableString、SpannableStringBuilder與String一樣,
首先也是傳字符串,但SpannableString、SpannableStringBuilder可以對這些字符串添加額外的樣式信息,但String則不行。注意:如果這些額外信息能被所用的方式支持,比如將SpannableString傳給TextView;也有對這些額外信息不支持的,比如前一章講到的Canvas繪製文字,對於不支持的情況,SpannableString和SpannableStringBuilder就是退化爲String類型,直接顯示原來的String字符串,而不會再顯示這些附加的額外信息。
2、SpannableString與SpannableStringBuilder區別 它們的區別在於
SpannableString像一個String一樣,構造對象的時候傳入一個String,之後再無法更改String的內容,也無法拼接多個
SpannableString;而SpannableStringBuilder則更像是StringBuilder,它可以通過其append()方法來拼接多個String。
3、SetSpan() void setSpan (Object what, int start, int end, int
flags)函數意義:給SpannableString或SpannableStringBuilder特定範圍的字符串設定Span樣式,可以設置多個(比如同時加上下劃線和刪除線等),Falg參數標識了當在所標記範圍前和標記範圍後緊貼着插入新字符時的動作,即是否對新插入的字符應用同樣的樣式。(這個後面會具體舉例說明)
參數說明:
object what :對應的各種Span,後面會提到; int start:開始應用指定Span的位置,索引從0開始 int
end:結束應用指定Span的位置,特效並不包括這個位置。比如如果這裏數爲3(即第4個字符),第4個字符不會有任何特效。從下面的例子也可以看出來。
int flags:取值有如下四個
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE:前後都不包括,即在指定範圍的前面和後面插入新字符都不會應用新樣式
Spannable.SPAN_EXCLUSIVE_INCLUSIVE :前面不包括,後面包括。即僅在範圍字符的後面插入新字符時會應用新樣式
Spannable.SPAN_INCLUSIVE_EXCLUSIVE :前面包括,後面不包括。
Spannable.SPAN_INCLUSIVE_INCLUSIVE :前後都包括。
設置粗體\斜體
SpannableStringBuilder spannableString = new SpannableStringBuilder();
spannableString.append("咿呀咿呀的博客哈哈哈哈哈哈");
//setSpan可多次使用
StyleSpan styleSpan = new StyleSpan(Typeface.BOLD);//粗體
spannableString.setSpan(styleSpan, 0, 3, Spannable.SPAN_EXCLUSIVE_INCLUSIVE);
StyleSpan styleSpan2 = new StyleSpan(Typeface.ITALIC);//斜體
spannableString.setSpan(styleSpan2, 3, 6, Spannable.SPAN_EXCLUSIVE_INCLUSIVE);
StyleSpan styleSpan3 = new StyleSpan(Typeface.BOLD_ITALIC);//粗斜體
spannableString.setSpan(styleSpan3, 6, 9, Spannable.SPAN_EXCLUSIVE_INCLUSIVE);
((TextView)findViewById(R.id.mode5)).setText(spannableString);
設置下劃線
SpannableStringBuilder spannableString = new SpannableStringBuilder();
spannableString.append("哈哈哈哈哈哈哈哈哈還");
StrikethroughSpan strikethroughSpan = new StrikethroughSpan();
spannableString.setSpan(strikethroughSpan, 0, 8, Spannable.SPAN_EXCLUSIVE_INCLUSIVE);
((TextView)findViewById(R.id.mode6)).setText(spannableString);`
設置字體大小
/**
* 使用SpannableStringBuilder設置樣式——字體大小
*/
private void mode4() {
SpannableStringBuilder spannableString = new SpannableStringBuilder();
spannableString.append("哈哈哈哈哈哈哈哈哈哈哈哈");
AbsoluteSizeSpan absoluteSizeSpan = new AbsoluteSizeSpan(20);
spannableString.setSpan(absoluteSizeSpan, 0, 8, Spannable.SPAN_EXCLUSIVE_INCLUSIVE);
((TextView)findViewById(R.id.mode4)).setText(spannableString);
}
圖片
SpannableStringBuilder spannableString = new SpannableStringBuilder();
spannableString.append("哈哈哈哈哈哈哈哈哈哈哈哈");
ImageSpan imageSpan = new ImageSpan(this, R.mipmap.ic_launcher);
//也可以這樣
//Drawable drawable = getResources().getDrawable(R.mipmap.ic_launcher);
//drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());
//ImageSpan imageSpan1 = new ImageSpan(drawable);
//將index爲6、7的字符用圖片替代
spannableString.setSpan(imageSpan, 6, 8, Spannable.SPAN_EXCLUSIVE_INCLUSIVE);
((TextView)findViewById(R.id.mode8)).setText(spannableString);
點擊事件
SpannableStringBuilder spannableString = new SpannableStringBuilder();
spannableString.append("瞬間爆炸哈哈哈哈好哦");
ClickableSpan clickableSpan = new ClickableSpan() {
@Override
public void onClick(View view) {
Toast.makeText(MainActivity.this, "請不要點我", Toast.LENGTH_SHORT).show();
}
};
spannableString.setSpan(clickableSpan, 5, 8, Spannable.SPAN_EXCLUSIVE_INCLUSIVE);
TextView textView = (TextView)findViewById(R.id.mode9);
textView.setText(spannableString);
textView.setMovementMethod(LinkMovementMethod.getInstance());