日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

SpannableString

發布時間:2025/6/17 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SpannableString 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

http://blog.csdn.net/fengkuanghun/article/details/7904284

背景介紹

在開發應用過程中經常會遇到顯示一些不同的字體風格的信息猶如默認的LockScreen上面的時間和充電信息。對于類似的情況,可能第一反應就是用不同的多個TextView來實現,對于每個TextView設置不同的字體風格以滿足需求。

?

這里推薦的做法是使用android.text.*;和 android.text.style.*;下面的組件來實現RichText:也即在同一個TextView中設置不同的字體風格。對于某些應用,比如文本編輯,記事本,彩信,短信等地方,還必須使用這些組件才能達到想到的顯示效果。

?

主要的基本工具類有android.text.Spanned; android.text.SpannableString; android.text.SpannableStringBuilder;使用這些類來代替常規String。SpannableString和 SpannableStringBuilder可以用來設置不同的Span,這些Span便是用于實現Rich Text,比如粗體,斜體,前景色,背景色,字體大小,字體風格等等,android.text.style.*中定義了很多的Span類型可供使用。

?

這是相關的API的Class General Hierarchy:

?

因為Spannable等最終都實現了CharSequence接口,所以可以直接把SpannableString和SpannableStringBuilder通過TextView.setText()設置給TextView。

?

使用方法

?

當要顯示Rich Text信息的時候,可以使用創建一個SpannableString或SpannableStringBuilder,它們的區別在于 SpannableString像一個String一樣,構造對象的時候傳入一個String,之后再無法更改String的內容,也無法拼接多個 SpannableString;而SpannableStringBuilder則更像是StringBuilder,它可以通過其append()方法來拼接多個String:

?

SpannableString word = new SpannableString("The quick fox jumps over the lazy dog");SpannableStringBuilder multiWord = new SpannableStringBuilder(); multiWord.append("The Quick Fox"); multiWord.append("jumps over"); multiWord.append("the lazy dog");

創建完Spannable對象后,就可以為它們設置Span來實現想要的Rich Text了,常見的Span有:

  • AbsoluteSizeSpan(int size) ---- 設置字體大小,參數是絕對數值,相當于Word中的字體大小
  • RelativeSizeSpan(float proportion) ---- 設置字體大小,參數是相對于默認字體大小的倍數,比如默認字體大小是x, 那么設置后的字體大小就是x*proportion,這個用起來比較靈活,proportion>1就是放大(zoom in), proportion<1就是縮小(zoom out)
  • ScaleXSpan(float proportion) ---- 縮放字體,與上面的類似,默認為1,設置后就是原來的乘以proportion,大于1時放大(zoon in),小于時縮小(zoom out)
  • BackgroundColorSpan(int color) ----背景著色,參數是顏色數值,可以直接使用android.graphics.Color里面定義的常量,或是用Color.rgb(int, int, int)
  • ForegroundColorSpan(int color) ----前景著色,也就是字的著色,參數與背景著色一致
  • TypefaceSpan(String family) ----字體,參數是字體的名字比如“sans", "sans-serif"等
  • StyleSpan(Typeface style) -----字體風格,比如粗體,斜體,參數是android.graphics.Typeface里面定義的常量,如Typeface.BOLD,Typeface.ITALIC等等。
  • StrikethroughSpan----如果設置了此風格,會有一條線從中間穿過所有的字,就像被劃掉一樣

對于這些Sytle span在使用的時候通常只傳上面所說明的構造參數即可,不需要設置其他的屬性,如果需要的話,也可以對它們設置其他的屬性,詳情可以參見文檔。
SpannableString和SpannableStringBuilder都有一個設置上述Span的方法:

?

/*** Set the style span to Spannable, such as SpannableString or SpannableStringBuilder* @param what --- the style span, such as StyleSpan* @param start --- the starting index of characters to which the style span to apply* @param end --- the ending index of characters to which the style span to apply* @param flags --- the flag specified to control*/ setSpan(Object what, int start, int end, int flags);

?

其中參數what是要設置的Style span,start和end則是標識String中Span的起始位置,而 flags是用于控制行為的,通常設置為0或Spanned中定義的常量,常用的有:

?

  • Spanned.SPAN_EXCLUSIVE_EXCLUSIVE --- 不包含兩端start和end所在的端點
  • Spanned.SPAN_EXCLUSIVE_INCLUSIVE?--- 不包含端start,但包含end所在的端點
  • Spanned.SPAN_INCLUSIVE_EXCLUSIVE?--- 包含兩端start,但不包含end所在的端點
  • Spanned.SPAN_INCLUSIVE_INCLUSIVE--- 包含兩端start和end所在的端點

?

這里理解起來就好像數學中定義區間,開區間還是閉區間一樣的。還有許多其他的Flag,可以參考這里。這里要重點說明下關于參數0,有很多時候,如果設置了上述的參數,那么Span會從start應用到Text結尾,而不是在start和end二者之間,這個時候就需要使用Flag 0。

?

Linkify

?

?

?

另外,也可以對通過TextView.setAutoLink(int)設置其Linkify屬性,其用處在于,TextView會自動檢查其內容,會識別出phone number, web address or email address,并標識為超鏈接,可點擊,點擊后便跳轉到相應的應用,如Dialer,Browser或Email。Linkify有幾個常用選項,更多的請參考文檔:

?

  • Linkify.EMAIL_ADDRESS -- 僅識別出TextView中的Email在址,標識為超鏈接,點擊后會跳到Email,發送郵件給此地址
  • Linkify.PHONE_NUMBERS?-- 僅識別出TextView中的電話號碼,標識為超鏈接,點擊后會跳到Dialer,Call這個號碼
  • Linkify.WEB_URLS-- 僅識別出TextView中的網址,標識為超鏈接,點擊后會跳到Browser打開此URL
  • Linkify.ALL -- 這個選項是識別出所有系統所支持的特殊Uri,然后做相應的操作

?

權衡選擇

?

個人認為軟件開發中最常見的問題不是某個技巧怎么使用的問題,而是何時該使用何技巧的問題,因為實現同一個目標可能有N種不同的方法,就要權衡利弊,選擇最合適的一個,正如常言所云,沒有最好的,只有最適合的。如前面所討論的,要想用不同的字體展現不同的信息可能的解法,除了用Style Span外還可以用多個TextView。那么就需要總結下什么時候該使用StyleSpan,什么時候該使用多個TextView:

?

  • 如果顯示的是多個不同類別的信息,就應該使用多個TextView,這樣也方便控制和改變各自的信息,例子就是默認LockScreen上面的日期和充電信息,因為它們所承載不同的信息,所以應該使用多個TextView來分別呈現。
  • 如果顯示的是同一類信息,或者同一個信息,那么應該使用StyleSpan。比如,短信息中,要把聯系人的相關信息突出顯示;或是想要Highlight某些信息等。
  • 如果要實現Rich text,沒辦法,只能使用Style span。
  • 如果要實現某些特效,也可以考慮使用StyleSpan。設置不同的字體風格只是Style span的初級應用,如果深入研究,可以發現很多奇妙的功效。
  • ?

    Spannable與ImageSapn結合使用可實現在EditText中實現圖文混排的效果

    http://blog.csdn.net/ah200614435/article/details/7914459

    ?

    下面是一些實例代碼

  • /**?
  • *?超鏈接?
  • */??
  • private?void?addUrlSpan()?{??
  • ????SpannableString?spanString?=?new?SpannableString("超鏈接");??
  • ????URLSpan?span?=?new?URLSpan("tel:0123456789");??
  • ????spanString.setSpan(span,?0,?3,?Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);??
  • ????tv.append(spanString);??
  • }??
  • ??
  • ??
  • /**?
  • *?文字背景顏色?
  • */??
  • private?void?addBackColorSpan()?{??
  • ????SpannableString?spanString?=?new?SpannableString("顏色2");??
  • ????BackgroundColorSpan?span?=?new?BackgroundColorSpan(Color.YELLOW);??
  • ????spanString.setSpan(span,?0,?3,?Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);??
  • ????tv.append(spanString);??
  • }??
  • ??
  • ??
  • /**?
  • *?文字顏色?
  • */??
  • private?void?addForeColorSpan()?{??
  • ????SpannableString?spanString?=?new?SpannableString("顏色1");??
  • ????ForegroundColorSpan?span?=?new?ForegroundColorSpan(Color.BLUE);??
  • ????spanString.setSpan(span,?0,?3,?Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);??
  • ????tv.append(spanString);??
  • }??
  • ??
  • ??
  • /**?
  • *?字體大小?
  • */??
  • private?void?addFontSpan()?{??
  • ????SpannableString?spanString?=?new?SpannableString("36號字體");??
  • ????AbsoluteSizeSpan?span?=?new?AbsoluteSizeSpan(36);??
  • ????spanString.setSpan(span,?0,?5,?Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);??
  • ????tv.append(spanString);??
  • }??
  • ??
  • ??
  • /**?
  • *?粗體,斜體?
  • */??
  • private?void?addStyleSpan()?{??
  • ????SpannableString?spanString?=?new?SpannableString("BIBI");??
  • ????StyleSpan?span?=?new?StyleSpan(Typeface.BOLD_ITALIC);??
  • ????spanString.setSpan(span,?0,?2,?Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);??
  • ????tv.append(spanString);??
  • }??
  • ??
  • ??
  • /**?
  • *?刪除線?
  • */??
  • private?void?addStrikeSpan()?{??
  • ????SpannableString?spanString?=?new?SpannableString("刪除線");??
  • ????StrikethroughSpan?span?=?new?StrikethroughSpan();??
  • ????spanString.setSpan(span,?0,?3,?Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);??
  • ????tv.append(spanString);??
  • }??
  • ??
  • /**?
  • *?下劃線?
  • */??
  • private?void?addUnderLineSpan()?{??
  • ????SpannableString?spanString?=?new?SpannableString("下劃線");??
  • ????UnderlineSpan?span?=?new?UnderlineSpan();??
  • ????spanString.setSpan(span,?0,?3,?Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);??
  • ????tv.append(spanString);??
  • }??
  • ??
  • ??
  • ??
  • /**?
  • *?圖片?
  • */??
  • private?void?addImageSpan()?{??
  • ????SpannableString?spanString?=?new?SpannableString("?");??
  • ????Drawable?d?=?getResources().getDrawable(R.drawable.ic_launcher);??
  • ????d.setBounds(0,?0,?d.getIntrinsicWidth(),?d.getIntrinsicHeight());??
  • ????ImageSpan?span?=?new?ImageSpan(d,?ImageSpan.ALIGN_BASELINE);??
  • ????spanString.setSpan(span,?0,?1,?Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);??
  • ????tv.append(spanString);??
  • }??
  • }??
  • 轉載于:https://www.cnblogs.com/lianghui66/p/3393857.html

    總結

    以上是生活随笔為你收集整理的SpannableString的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。