原文地址:http://www.cnblogs.com/kross/p/3645594.html
以前一直好奇QQ的輸入框里面是如何出現表情的,今天看了下這個,心中發出“原來是這樣啊”的感嘆。
通常情況下,我們都是使用字符串類型的變量,直接放置在TextView.setText()的參數里面的。這樣只能單純的輸出字符串。如果要給TextView加上特殊的文本效果,就要使用SpannableString這個類了。
用法如下:
new一個SpannableString對象,將要顯示的字符串作為構造方法的參數傳入。
調用SpannableString.setSpan(Object, int, int, int)方法進行設置。第一個參數為需要設定的樣式,有很多個類可以選擇,都在這里啦:http://developer.android.com/reference/android/text/style/CharacterStyle.html
官方文檔上面那里的直接子類和間接子類都是可以用的樣式。
第二參數是開始的位置,0表示第一個字符
第三個參數是結束的位置
第四個參數是一個表示替換的位置是否會影響開頭和結尾,誒……我試了下發現沒什么變化呢……
然后就是把這個SpannableString對象傳給TextView.setText()方法的參數就好了。
代碼如下:
public class MainActivity extends Activity { private TextView tvTest = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); tvTest = (TextView)findViewById(R.id.tv_test); SpannableString ss = new SpannableString("abcdefg"); //前景色 //ss.setSpan(new ForegroundColorSpan(Color.BLUE), 1, 2, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); //背景色 //ss.setSpan(new BackgroundColorSpan(Color.RED), 1, 2, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); //可點擊觸發事件 //ss.setSpan(new TextClickSpan(), 0, 5, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); //觸發事件的話,要加上下面這句話 //tvTest.setMovementMethod(LinkMovementMethod.getInstance()); //下划線 //ss.setSpan(new UnderlineSpan(), 0, 5, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); //放置圖片 ss.setSpan(new ImageSpan(this, R.drawable.ic_launcher), 0, 5, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); tvTest.setText(ss); } class TextClickSpan extends ClickableSpan { @Override public void onClick(View widget) { Log.i("clickable span", "click"); Toast.makeText(MainActivity.this, "aaaa", Toast.LENGTH_SHORT).show(); } } }
其實這個感覺就像是那種替換一樣~