Android TextView中文字通過SpannableString來設置超鏈接、顏色、字體等屬性

轉自:http://blog.csdn.net/snowdream86/article/details/6776629


在Android中,TextView是我們最常用的用來顯示文本的控件。

 一般情況下,TextView中的文本都是一個樣式。那麼如何對於TextView中各個部分的文本來設置字體,大小,顏色,樣式,以及超級鏈接等屬性呢?下面我們通過SpannableString的具體實例操作來演示一下。


  res-layout-main.xml


  1. <?xmlversion="1.0"encoding="utf-8"?>

  2. <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"

  3. android:layout_height="wrap_content"android:layout_width="wrap_content"android:orientation="horizontal">

  4. <TextView

  5. android:id="@+id/myTextView"

  6. android:layout_width="fill_parent"

  7. android:layout_height="wrap_content"

  8. />

  9. </LinearLayout>


res-color-color.xml

res-color-linkcolor.xml


  1. <?xmlversion="1.0"encoding="utf-8"?>

  2. <selectorxmlns:android="http://schemas.android.com/apk/res/android">

  3. <itemandroid:state_pressed="true"

  4. android:color="#ffffff00"/><!-- pressed -->

  5. <itemandroid:state_focused="true"

  6. android:color="#ff00ffff"/><!-- focused -->

  7. <itemandroid:color="#ff0ff000"/><!-- default -->

  8. </selector>


TextViewLinkActivity


  1. package com.snowdream;  

  2. import java.io.IOException;  

  3. import org.xmlpull.v1.XmlPullParserException;  

  4. import android.app.Activity;  

  5. import android.content.res.ColorStateList;  

  6. import android.content.res.XmlResourceParser;  

  7. import android.graphics.Bitmap;  

  8. import android.graphics.BitmapFactory;  

  9. import android.graphics.Color;  

  10. import android.graphics.drawable.Drawable;  

  11. import android.os.Bundle;  

  12. import android.text.SpannableString;  

  13. import android.text.Spanned;  

  14. import android.text.method.LinkMovementMethod;  

  15. import android.text.style.AbsoluteSizeSpan;  

  16. import android.text.style.BackgroundColorSpan;  

  17. import android.text.style.BulletSpan;  

  18. import android.text.style.DrawableMarginSpan;  

  19. import android.text.style.ForegroundColorSpan;  

  20. import android.text.style.IconMarginSpan;  

  21. import android.text.style.ImageSpan;  

  22. import android.text.style.RelativeSizeSpan;  

  23. import android.text.style.ScaleXSpan;  

  24. import android.text.style.StrikethroughSpan;  

  25. import android.text.style.StyleSpan;  

  26. import android.text.style.SubscriptSpan;  

  27. import android.text.style.SuperscriptSpan;  

  28. import android.text.style.TextAppearanceSpan;  

  29. import android.text.style.TypefaceSpan;  

  30. import android.text.style.URLSpan;  

  31. import android.text.style.UnderlineSpan;  

  32. import android.widget.TextView;  

  33. publicclass TextViewLinkActivity extends Activity {  

  34.    TextView mTextView = null;    

  35.    SpannableString msp = null;    

  36. /** Called when the activity is first created. */

  37. @Override

  38. publicvoid onCreate(Bundle savedInstanceState) {  

  39. super.onCreate(savedInstanceState);  

  40.        setContentView(R.layout.main);  

  41.        mTextView = (TextView)findViewById(R.id.myTextView);  

  42. //創建一個 SpannableString對象  

  43.        msp = new SpannableString("字體測試字體大小一半兩倍前景色背景色正常粗體斜體粗斜體下劃線刪除線x1x2電話郵件網站短信彩信地圖X軸綜合/bot");  

  44. //設置字體(default,default-bold,monospace,serif,sans-serif)

  45.        msp.setSpan(new TypefaceSpan("monospace"), 0, 2, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);  

  46.        msp.setSpan(new TypefaceSpan("serif"), 2, 4, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);  

  47. //設置字體大小(絕對值,單位:像素)

  48.        msp.setSpan(new AbsoluteSizeSpan(20), 4, 6, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);  

  49.        msp.setSpan(new AbsoluteSizeSpan(20,true), 6, 8, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);  //第二個參數boolean dip,如果爲true,表示前面的字體大小單位爲dip,否則爲像素,同上。

  50. //設置字體大小(相對值,單位:像素) 參數表示爲默認字體大小的多少倍

  51.        msp.setSpan(new RelativeSizeSpan(0.5f), 8, 10, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);  //0.5f表示默認字體大小的一半

  52.        msp.setSpan(new RelativeSizeSpan(2.0f), 10, 12, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);  //2.0f表示默認字體大小的兩倍

  53. //設置字體前景色

  54.        msp.setSpan(new ForegroundColorSpan(Color.MAGENTA), 12, 15, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);  //設置前景色爲洋紅色

  55. //設置字體背景色

  56.        msp.setSpan(new BackgroundColorSpan(Color.CYAN), 15, 18, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);  //設置背景色爲青色

  57. //設置字體樣式正常,粗體,斜體,粗斜體

  58.        msp.setSpan(new StyleSpan(android.graphics.Typeface.NORMAL), 18, 20, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);  //正常

  59.        msp.setSpan(new StyleSpan(android.graphics.Typeface.BOLD), 20, 22, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);  //粗體

  60.        msp.setSpan(new StyleSpan(android.graphics.Typeface.ITALIC), 22, 24, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);  //斜體

  61.        msp.setSpan(new StyleSpan(android.graphics.Typeface.BOLD_ITALIC), 24, 27, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);  //粗斜體

  62. //設置下劃線

  63.        msp.setSpan(new UnderlineSpan(), 27, 30, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);  

  64. //設置刪除線

  65.        msp.setSpan(new StrikethroughSpan(), 30, 33, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);  

  66. //設置上下標

  67.        msp.setSpan(new SubscriptSpan(), 34, 35, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);     //下標  

  68.        msp.setSpan(new SuperscriptSpan(), 36, 37, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);   //上標            

  69. //超級鏈接(需要添加setMovementMethod方法附加響應)

  70.        msp.setSpan(new URLSpan("tel:4155551212"), 37, 39, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);     //電話  

  71.        msp.setSpan(new URLSpan("mailto:[email protected]"), 39, 41, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);     //郵件  

  72.        msp.setSpan(new URLSpan("http://www.baidu.com"), 41, 43, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);     //網絡    

  73.        msp.setSpan(new URLSpan("sms:4155551212"), 43, 45, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);     //短信   使用sms:或者smsto:

  74.        msp.setSpan(new URLSpan("mms:4155551212"), 45, 47, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);     //彩信   使用mms:或者mmsto:

  75.        msp.setSpan(new URLSpan("geo:38.899533,-77.036476"), 47, 49, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);     //地圖  

  76. //設置字體大小(相對值,單位:像素) 參數表示爲默認字體寬度的多少倍

  77.        msp.setSpan(new ScaleXSpan(2.0f), 49, 51, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); //2.0f表示默認字體寬度的兩倍,即X軸方向放大爲默認字體的兩倍,而高度不變

  78. //設置字體(依次包括字體名稱,字體大小,字體樣式,字體顏色,鏈接顏色)

  79.        ColorStateList csllink = null;  

  80.        ColorStateList csl = null;  

  81.        XmlResourceParser xppcolor=getResources().getXml (R.color.color);  

  82. try {  

  83.            csl= ColorStateList.createFromXml(getResources(),xppcolor);  

  84.        }catch(XmlPullParserException e){  

  85. // TODO: handle exception

  86.            e.printStackTrace();          

  87.        }catch(IOException e){  

  88. // TODO: handle exception

  89.            e.printStackTrace();          

  90.        }  

  91.        XmlResourceParser xpplinkcolor=getResources().getXml(R.color.linkcolor);  

  92. try {  

  93.            csllink= ColorStateList.createFromXml(getResources(),xpplinkcolor);  

  94.        }catch(XmlPullParserException e){  

  95. // TODO: handle exception

  96.            e.printStackTrace();          

  97.        }catch(IOException e){  

  98. // TODO: handle exception

  99.            e.printStackTrace();          

  100.        }  

  101.        msp.setSpan(new TextAppearanceSpan("monospace",android.graphics.Typeface.BOLD_ITALIC, 30, csl, csllink), 51, 53, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);  

  102. //設置項目符號

  103.        msp.setSpan(new BulletSpan(android.text.style.BulletSpan.STANDARD_GAP_WIDTH,Color.GREEN), 0 ,msp.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); //第一個參數表示項目符號佔用的寬度,第二個參數爲項目符號的顏色

  104. //設置圖片

  105.        Drawable drawable = getResources().getDrawable(R.drawable.icon);  

  106.        drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());    

  107.        msp.setSpan(new ImageSpan(drawable), 53, 57, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);  

  108.        mTextView.setText(msp);  

  109.        mTextView.setMovementMethod(LinkMovementMethod.getInstance());  

  110.    }  

  111. }  


效果預覽:

0_13165370656R4j.gif


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