Android:一個TextView分段改變樣式、添加監聽事件的實現方式(類似朋友圈評論)

[注: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項目下載地址

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章