SpannableString與SpannableStringBuilder DecimalFormat 和 BigFormat

一、SpannableString與SpannableStringBuilder


1、SpannableString、SpannableStringBuilder與String的關係

SpannableString、SpannableStringBuilder與String基本上差不多,都是用來存儲字符串的,但他們倆可以通過SetSpan()函數,給這些存儲的String添加各種格式和樣式,將原來的String以不同的樣式顯示出來,如給原來的String加上下劃線、加背景顏色、改變字體顏色、用圖片把制定文字替換等等。

注意:如果這些額外的信息能被所用的方式支持,比如講SpannableString傳給TextView;也有對這些額外信息不支持的,比如使用Canvas繪製文字,對於不支持的情況,SpannableString和SpannableStringBuilder將退化爲String類型,直接顯示原來的字符串,不顯示額外的附加信息。

2、SpannableString與SpannableStringBuilder的區別

他們的區別就像String和StringBuilder的區別一樣,一個是在傳入String之後無法修改,另一個可以使用append來拼接多個String
//使用SpannableString,必須一次傳入,構造完成  
SpannableString word = new SpannableString("歡迎光臨我的博客");  
  
//使用SpannableStringBuilder,可以使用append()再添加  
SpannableStringBuilder multiWord = new SpannableStringBuilder();  
multiWord.append("歡迎光臨");  
multiWord.append("我的");  
multiWord.append("博客");  

因爲SpannableString和SpannableStringBuilder都實現了CharSequence接口,可以直接通過TextView.setText()設置給TextView

3、SetSpan()方法

void setSpan(Object what, int start, int end, int flags)

函數意義:給SpannableString或SpannableStringBuilder特定範圍的字符串設定Span樣式,可以設置多個(比如同時加上下劃線和刪除線等),Falg參數標識了當在所標記範圍前和標記範圍後緊貼着插入新字符時的動作,即是否對新插入的字符應用同樣的樣式。(這個後面會具體舉例說明)

參數說明:

object what :對應的各種Span,後面會提到;
int start:開始應用指定Span的位置,索引從0開始
int end:結束應用指定Span的位置,特效並不包括這個位置。比如如果這裏數爲3(即第4個字符),第4個字符不會有任何特效。從下面的例子也可以看出來。

int flags:取值有如下四個
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE:前後都不包括,即在指定範圍的前面和後面插入新字符都不會應用新樣式 
Spannable.SPAN_EXCLUSIVE_INCLUSIVE:前面不包括,後面包括。即僅在範圍字符的後面插入新字符時會應用新樣式
Spannable.SPAN_INCLUSIVE_EXCLUSIVE:前面包括,後面不包括。
Spannable.SPAN_INCLUSIVE_INCLUSIVE:前後都包括。

舉個例子來說明這個前後包括的問題:

由於Flag的作用是用來指定範圍前後輸入新的字符時,會不會應用效果的,所以我們利用EditText來顯示SpannableString

(1)、佈局XML中加入一個EditText控件:

[html] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     xmlns:tools="http://schemas.android.com/tools"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="match_parent"  
  5.     tools:context="com.example.try_spannable_blog.MainActivity" >  
  6.   
  7.     <EditText  
  8.         android:id="@+id/edit"  
  9.         android:layout_width="wrap_content"  
  10.         android:layout_height="wrap_content" />  
  11.   
  12. </RelativeLayout>  
(2)、這裏用一個改變字體顏色的Span來做下演示
[java] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. public class MainActivity extends Activity {  
  2.       
  3.     private EditText editText;    
  4.     @Override  
  5.     protected void onCreate(Bundle savedInstanceState) {  
  6.         super.onCreate(savedInstanceState);  
  7.         setContentView(R.layout.activity_main);  
  8.           
  9.         editText = (EditText)findViewById(R.id.edit);  
  10.           
  11.         //改變字體顏色  
  12.         //先構造SpannableString  
  13.         SpannableString spanString = new SpannableString("歡迎光臨Harvic的博客");    
  14.        //再構造一個改變字體顏色的Span  
  15.         ForegroundColorSpan span = new ForegroundColorSpan(Color.BLUE);    
  16.         //將這個Span應用於指定範圍的字體  
  17.         spanString.setSpan(span, 13, Spannable.SPAN_EXCLUSIVE_INCLUSIVE);    
  18.         //設置給EditText顯示出來  
  19.         editText.setText(spanString);  
  20.     }  
  21. }  
初始化效果是這樣的:

分別在設置Span的前面和後面加入新文字,結果是這樣的


在前面和後面都加入蝦米兩個字,可見,前面的蝦米沒有任何效果,後面的則不同,添加上相同的Span特效,這是由於我們設置了Spannable.SPAN_EXCLUSIVE_INCLUSIVE的原因,即(前面不應用特效,後面應用特效),其它幾個Flags參數的含義想必大家也都清楚了。在此就不再贅述。


4、使用:

使用起來一般分爲三個步驟:
1、構造String
2、構造Span
3、使用setSpan給String設置樣式

SpannableString spanString = new SpannableString("歡迎光臨Harvic的博客");    
//再構造一個改變字體顏色的Span  
ForegroundColorSpan span = new ForegroundColorSpan(Color.BLUE);    
//將這個Span應用於指定範圍的字體  
spanString.setSpan(span, 1, 5, Spannable.SPAN_EXCLUSIVE_INCLUSIVE);    
//設置給EditText顯示出來  
editText.setText(spanString);  



除了設置字體顏色 ForegroundColorSpan,另外還有字體背景顏色 BackgroundColorSpan,字體大小 AbsoluteSizeSpan,字體樣式 StyleSpan,刪除線 StrikethroughSpan,下劃線 UnderlineSpan,圖片置換 ImageSpan


二、DecimalFormat 和 BigDecimal


1、DecimalFormat

        double d1 = 1234.5678;
        double d2 = 111111111113.141592654;

        //常用的Pattern字符爲 0 和 #
        //0 表示阿拉伯數字,本位沒有也顯示0
        //# 表示阿拉伯數字,本位沒有顯示爲空
        //若小數位顯示不全都會四捨五入
        DecimalFormat df1 = new DecimalFormat("00000.00000");
        DecimalFormat df2 = new DecimalFormat("##.###");

        Log.d("test_decimalFormat", df1.format(d1));    //01234.56780
        Log.d("test_decimalFormat", df2.format(d1));    //1234.568


        DecimalFormat df3 = new DecimalFormat();
        //以百分數的形式顯示 並且保留兩位小數, 0和#還是上面的意義
        df3.applyPattern("#0.00%");
        Log.d("test_decimalFormat", df3.format(d1));    //123456.78%
        //以科學計數法的形式顯示,保留4位小數E後面的字符必須是 0
        df3.applyPattern("0.0000E0");
        Log.d("test_decimalFormat", df3.format(d2));    //1.1111E11
        //格式化輸出 若高位沒有明確的指出(如這裏的萬位)要按那種格式格式化,那麼按照 第一個 , 爲準
        df3.applyPattern("#,###.000");
        Log.d("test_decimalFormat", df3.format(d2));    //111,111,111,113.142

2、BigDecimal

可以將一個科學計數法表示的數字轉換成double 或 float,可以直接這麼使用 new BigDecimal("1.001E5");

下面附加一個連接,這裏比較詳細的描述了BigDecimal 的使用方法。

http://blog.csdn.net/jackiehff/article/details/8582449















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