android TextView設置刪除線,超鏈接,顏色和字體等說介紹

jopen 8年前發布 | 33K 次閱讀 Android開發 移動開發

要給 TextView 加上特殊效果,方式主要有幾種:
第一種,自動應用效果,使用 android:autolink 屬性,如:

<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/text1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:autoLink="all"
android:text="@string/link_text_auto"
/>

第二種,在文本中使用 標簽,如:

<string name="link_text_manual"><b>text2:</b> This is some other  
      text, with a <a >link</a> specified  
      via an &lt;a&gt; tag.  Use a \"tel:\" URL  
      to <a href="tel:4155551212">dial a phone number</a>  
</string>  

第三種,和第二種其實是一樣的,只不過將文本改在 JAVA 代碼中,如:

TextView t3 = (TextView) findViewById(R.id.text3);  
t3.setText(  
    Html.fromHtml(  
         "<b>text3:</b>  Text with a " +  
         "<a href=\"http://www.google.com\">link</a> " +  
         "created in the Java source code using HTML."));  

第四種,前面三種可以說都是自動的,而第四種就是純“手工”的了。通過創建 SpanableString 字符串,并在之上創 建一個或多個 Span 來實現豐富的效果。例子如下:

    SpannableString ss = new SpannableString("text4: Click here to dial the phone."); 
    ss.setSpan(new StyleSpan(Typeface.BOLD), 0, 6,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); 
    ss.setSpan(new URLSpan("tel:4155551212"), 13, 17,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); 

    TextView t4 = (TextView) findViewById(R.id.text4); 
    t4.setText(ss); 

t4.setMovementMethod(LinkMovementMethod.getInstance());
setMovementMethod,此方法在需要響應用戶事件時使用,如點擊一個電話號碼就跳轉到撥號頁面。如果不執行這個方法是不會響應事件的,即便文本看著已經是下劃線藍色字了。
.Spanned.SPAN_EXCLUSIVE_EXCLUSIVE,這是在 setSpan 時需要指定的 flag,它的意義我試了很久也沒試出來,睡個覺,今天早上才突然有點想法,試之,果然。它是用來標識在 Span 范圍內的文本前后輸入新的字符時是否把它們也應用這個效果。分別有 Spanned.SPAN_EXCLUSIVE_EXCLUSIVE(前后都不包括)、Spanned.SPAN_INCLUSIVE_EXCLUSIVE(前面包括,后面不包括)、Spanned.SPAN_EXCLUSIVE_INCLUSIVE(前面不包括,后面包括)、Spanned.SPAN_INCLUSIVE_INCLUSIVE(前后都包括)。看個截圖就更明白了:

圖1
對比一下
圖2
以下轉自:http://blog.csdn.net/yang_hui1986527/article/details/6776629
在Android中,TextView是我們最常用的用來顯示文本的控件。
一般情況下,TextView中的文本都是一個樣式。那么如何對于TextView中各個部分的文本來設置字體,大小,顏色,樣式,以及超級鏈接等屬性呢?下面我們通過SpannableString的具體實例操作來演示一下。
res-layout-main.xml:

<?xml version="1.0" encoding="utf-8"?>  
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    android:layout_height="wrap_content" android:layout_width="wrap_content" android:orientation="horizontal">  
<TextView    
    android:id="@+id/myTextView"  
    android:layout_width="fill_parent"   
    android:layout_height="wrap_content"   
    />  
</LinearLayout>  

res-color-linkcolor.xml:

    <?xml version="1.0" encoding="utf-8"?>  
    <selector xmlns:android="http://schemas.android.com/apk/res/android">  
        <item android:state_pressed="true" android:color="#ffffff00"/> <!-- pressed -->  
        <item android:state_focused="true" android:color="#ff00ffff"/> <!-- focused -->  
        <item android:color="#ff0ff000"/> <!-- default -->  
    </selector>  

TextViewLinkActivity:

    import java.io.IOException; 

    import org.xmlpull.v1.XmlPullParserException; 

    import android.app.Activity; 
    import android.content.res.ColorStateList; 
    import android.content.res.XmlResourceParser; 
    import android.graphics.Bitmap; 
    import android.graphics.BitmapFactory; 
    import android.graphics.Color; 
    import android.graphics.drawable.Drawable; 
    import android.os.Bundle; 
    import android.text.SpannableString; 
    import android.text.Spanned; 
    import android.text.method.LinkMovementMethod; 
    import android.text.style.AbsoluteSizeSpan; 
    import android.text.style.BackgroundColorSpan; 
    import android.text.style.BulletSpan; 
    import android.text.style.DrawableMarginSpan; 
    import android.text.style.ForegroundColorSpan; 
    import android.text.style.IconMarginSpan; 
    import android.text.style.ImageSpan; 
    import android.text.style.RelativeSizeSpan; 
    import android.text.style.ScaleXSpan; 
    import android.text.style.StrikethroughSpan; 
    import android.text.style.StyleSpan; 
    import android.text.style.SubscriptSpan; 
    import android.text.style.SuperscriptSpan; 
    import android.text.style.TextAppearanceSpan; 
    import android.text.style.TypefaceSpan; 
    import android.text.style.URLSpan; 
    import android.text.style.UnderlineSpan; 
    import android.widget.TextView; 

    public class TextViewLinkActivity extends Activity {  
        TextView mTextView = null; 
        SpannableString msp = null; 

        /** Called when the activity is first created. */  
        @Override  
        public void onCreate(Bundle savedInstanceState) {  
            super.onCreate(savedInstanceState); 
            setContentView(R.layout.main); 

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

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

            //設置字體(default,default-bold,monospace,serif,sans-serif)  
            msp.setSpan(new TypefaceSpan("monospace"), 0, 2, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); 
            msp.setSpan(new TypefaceSpan("serif"), 2, 4, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); 

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

            //設置字體大小(相對值,單位:像素) 參數表示為默認字體大小的多少倍  
            msp.setSpan(new RelativeSizeSpan(0.5f), 8, 10, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); //0.5f表示默認字體大小的一半 
            msp.setSpan(new RelativeSizeSpan(2.0f), 10, 12, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); //2.0f表示默認字體大小的兩倍 

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

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

            //設置字體樣式正常,粗體,斜體,粗斜體  
            msp.setSpan(new StyleSpan(android.graphics.Typeface.NORMAL), 18, 20, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); //正常 
            msp.setSpan(new StyleSpan(android.graphics.Typeface.BOLD), 20, 22, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); //粗體 
            msp.setSpan(new StyleSpan(android.graphics.Typeface.ITALIC), 22, 24, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); //斜體 
            msp.setSpan(new StyleSpan(android.graphics.Typeface.BOLD_ITALIC), 24, 27, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); //粗斜體 

            //設置下劃線  
            msp.setSpan(new UnderlineSpan(), 27, 30, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); 

            //設置刪除線  
            msp.setSpan(new StrikethroughSpan(), 30, 33, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); 

            //設置上下標  
            msp.setSpan(new SubscriptSpan(), 34, 35, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); //下標 
            msp.setSpan(new SuperscriptSpan(), 36, 37, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); //上標 

            //超級鏈接(需要添加setMovementMethod方法附加響應)  
            msp.setSpan(new URLSpan("tel:4155551212"), 37, 39, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); //電話 
            msp.setSpan(new URLSpan("mailto:webmaster@google.com"), 39, 41, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); //郵件 
            msp.setSpan(new URLSpan("http://www.baidu.com"), 41, 43, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); //網絡 
            msp.setSpan(new URLSpan("sms:4155551212"), 43, 45, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); //短信 使用sms:或者smsto: 
            msp.setSpan(new URLSpan("mms:4155551212"), 45, 47, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); //彩信 使用mms:或者mmsto: 
            msp.setSpan(new URLSpan("geo:38.899533,-77.036476"), 47, 49, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); //地圖 

            //設置字體大小(相對值,單位:像素) 參數表示為默認字體寬度的多少倍  
            msp.setSpan(new ScaleXSpan(2.0f), 49, 51, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); //2.0f表示默認字體寬度的兩倍,即X軸方向放大為默認字體的兩倍,而高度不變 

            //設置字體(依次包括字體名稱,字體大小,字體樣式,字體顏色,鏈接顏色)  
            ColorStateList csllink = null; 
            ColorStateList csl = null; 
            XmlResourceParser xppcolor=getResources().getXml (R.color.color); 
            try {  
                csl= ColorStateList.createFromXml(getResources(),xppcolor); 
            }catch(XmlPullParserException e){  
                // TODO: handle exception  
                e.printStackTrace(); 
            }catch(IOException e){  
                // TODO: handle exception  
                e.printStackTrace(); 
            }  

            XmlResourceParser xpplinkcolor=getResources().getXml(R.color.linkcolor); 
            try {  
                csllink= ColorStateList.createFromXml(getResources(),xpplinkcolor); 
            }catch(XmlPullParserException e){  
                // TODO: handle exception  
                e.printStackTrace(); 
            }catch(IOException e){  
                // TODO: handle exception  
                e.printStackTrace(); 
            }  
            msp.setSpan(new TextAppearanceSpan("monospace",android.graphics.Typeface.BOLD_ITALIC, 30, csl, csllink), 51, 53, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); 

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

            //設置圖片  
            Drawable drawable = getResources().getDrawable(R.drawable.icon); 
            drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight()); 
            msp.setSpan(new ImageSpan(drawable), 53, 57, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); 

            mTextView.setText(msp); 
            mTextView.setMovementMethod(LinkMovementMethod.getInstance()); 
        }  
    }  

效果預覽:
預覽圖

來自: http://blog.csdn.net/ddwhan0123/article/details/45072657

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!