[注:TextParser類轉自 http://blog.csdn.net/jiaoyang623/article/details/7792286 ]
public class TextParser {
private List<TextBean> textList;
public TextParser() {
textList = new LinkedList<TextBean>();
}
/**
* 添加文字
* */
public TextParser append(String text, int size, int color) {
if (text == null) {
return this;
}
TextBean bean = new TextBean();
bean.text = text;
bean.size = size;
bean.color = color;
textList.add(bean);
return this;
}
/**
* 添加帶鏈接的文字
* */
public TextParser append(String text, int size, int color, OnClickListener onClickListener) {
if (text == null) {
return this;
}
TextBean bean = new TextBean();
bean.text = text;
bean.size = size;
bean.color = color;
bean.onClickListener = onClickListener;
textList.add(bean);
return this;
}
/**
* 寫入TextView
* */
public void parse(TextView textView) {
// 先將文字放在一起,傳入到SpannableBuilder中
// 後面做的是對文本進行修飾和替換
StringBuilder sBuilder = new StringBuilder();
for (TextBean bean : textList) {
sBuilder.append(bean.text);
}
// 所有的文字和效果都要寫在Spannable中,SpanableStringBuilder用於創建Spannable,
// 其實它也是Spannable的一個實現類
SpannableStringBuilder style = new SpannableStringBuilder(sBuilder);
int position = 0;
for (TextBean bean : textList) {
if (bean.onClickListener != null) {
// 如果有點擊,則在上面添加點擊處理的Span
style.setSpan(new MyClickableSpan(bean.onClickListener),// Span接口用於實現對文本的修飾的具體內容
position,// 修飾的起始位置
position + bean.text.length(),// 修飾的結束位置
Spannable.SPAN_EXCLUSIVE_INCLUSIVE);
}
// 字體上色,字體的背景顏色也可以單獨改變
style.setSpan(new ForegroundColorSpan(bean.color), position,
position + bean.text.length(),
Spannable.SPAN_EXCLUSIVE_INCLUSIVE);
// 改變字體大小
style.setSpan(new AbsoluteSizeSpan(bean.size), position, position+ bean.text.length(), Spannable.SPAN_EXCLUSIVE_INCLUSIVE);
/*
* 如上所示,Spannalbe接口是說這個類可以被改變,Span說的是這個類可以去改變別的類
* 整個改變樣式做的就是用Span去改變Spannable中的內容。
*/
position += bean.text.length();
}
// 設置TextView讓文字可以被點擊
textView.setMovementMethod(LinkMovementMethod.getInstance());
textView.setText(style);
}
/**
* 用於記錄文本的內容,字體,大小和監聽器
* */
private class TextBean {
public OnClickListener onClickListener;
public String text;
public int size;
public int color;
}
/**
* 用於更改文字點擊的事件和效果
* */
private static class MyClickableSpan extends ClickableSpan {
private OnClickListener mOnClickListener;
public MyClickableSpan(OnClickListener onClickListener) {
mOnClickListener = onClickListener;
}
@Override
public void onClick(View widget) {
if (mOnClickListener != null) {
mOnClickListener.onClick(widget);
}
}
@Override
public void updateDrawState(TextPaint ds) {
}
}
/*
* 使用這個類改變文本樣式共分三步:
創建TextParser類
通過append向TextParser中添加文本和樣式參數
調用parse將結果輸出到TextView中
TextView textView=new TextView(context);
TextParser textParser=new TextParser();
textParser.append("A text in one style, ", 20, Color.BLUE);
textParser.append("and a text in another style.", 10, Color.GREEN);
textParser.parse(textView);
*/
}
主Activity:
public class MainActivity extends Activity {
private TextView mTextView;
private String nameStr = "Ricky:";
private String contentStr = "深圳這個星期的天氣不怎麼樣啊!";
private Context mContext = MainActivity.this;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mTextView = (TextView)findViewById(R.id.test_text);
TextParser textParser = new TextParser();
textParser.append(nameStr, 20, Color.BLUE, new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Toast.makeText(mContext, "click name", Toast.LENGTH_SHORT).show();
}
});
textParser.append(contentStr, 20, Color.BLACK, new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Toast.makeText(mContext, "click content", Toast.LENGTH_SHORT).show();
}
});
textParser.parse(mTextView);
}
}
上述操作可以實現類似朋友圈、說說評論,點擊用戶名字及評論內容分別有不同的操作。
實現的效果圖如下:
demo項目下載地址