Android 在 TextView 中设置超链接、颜色、字体、图片

方案:通过spannablestring实现textview的丰富调控

Note:

1. 文本中的空格可通过 <string name=”blank_space”>&#160;&#160;&#160;&#160;img</string>实现

参考代码如下:

001 import java.io.IOException;
002  
003 import org.xmlpull.v1.XmlPullParserException;
004  
005 import android.app.Activity;
006 import android.content.res.ColorStateList;
007 import android.content.res.XmlResourceParser;
008 import android.graphics.Bitmap;
009 import android.graphics.BitmapFactory;
010 import android.graphics.Color;
011 import android.graphics.drawable.Drawable;
012 import android.os.Bundle;
013 import android.text.SpannableString;
014 import android.text.Spanned;
015 import android.text.method.LinkMovementMethod;
016 import android.text.style.AbsoluteSizeSpan;
017 import android.text.style.BackgroundColorSpan;
018 import android.text.style.BulletSpan;
019 import android.text.style.DrawableMarginSpan;
020 import android.text.style.ForegroundColorSpan;
021 import android.text.style.IconMarginSpan;
022 import android.text.style.ImageSpan;
023 import android.text.style.RelativeSizeSpan;
024 import android.text.style.ScaleXSpan;
025 import android.text.style.StrikethroughSpan;
026 import android.text.style.StyleSpan;
027 import android.text.style.SubscriptSpan;
028 import android.text.style.SuperscriptSpan;
029 import android.text.style.TextAppearanceSpan;
030 import android.text.style.TypefaceSpan;
031 import android.text.style.URLSpan;
032 import android.text.style.UnderlineSpan;
033 import android.widget.TextView;
034  
035 public class TextViewLinkActivity extends Activity {
036     TextView mTextView = null;
037     SpannableString msp = null
038  
039     /** Called when the activity is first created. */
040     @Override
041     public void onCreate(Bundle savedInstanceState) {
042         super.onCreate(savedInstanceState);
043         setContentView(R.layout.main);
044  
045         mTextView = (TextView)findViewById(R.id.myTextView);
046  
047         //创建一个 SpannableString对象
048         msp = new SpannableString("字体测试字体大小一半两倍前景色背景色正常粗体斜体粗斜体下划线删除线x1x2电话邮件网站短信彩信地图X轴综合/bot");
049  
050         //设置字体(default,default-bold,monospace,serif,sans-serif)
051         msp.setSpan(new TypefaceSpan("monospace"), 02, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
052         msp.setSpan(new TypefaceSpan("serif"), 24, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
053  
054         //设置字体大小(绝对值,单位:像素)
055         msp.setSpan(new AbsoluteSizeSpan(20), 46, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
056         msp.setSpan(new AbsoluteSizeSpan(20,true), 68, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);  //第二个参数boolean dip,如果为true,表示前面的字体大小单位为dip,否则为像素,同上。
057  
058         //设置字体大小(相对值,单位:像素) 参数表示为默认字体大小的多少倍
059         msp.setSpan(new RelativeSizeSpan(0.5f), 810, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);  //0.5f表示默认字体大小的一半
060         msp.setSpan(new RelativeSizeSpan(2.0f), 1012, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);  //2.0f表示默认字体大小的两倍
061  
062         //设置字体前景色
063         msp.setSpan(new ForegroundColorSpan(Color.MAGENTA), 1215, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);  //设置前景色为洋红色
064  
065         //设置字体背景色
066         msp.setSpan(new BackgroundColorSpan(Color.CYAN), 1518, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);  //设置背景色为青色
067  
068         //设置字体样式正常,粗体,斜体,粗斜体
069         msp.setSpan(new StyleSpan(android.graphics.Typeface.NORMAL), 1820, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);  //正常
070         msp.setSpan(new StyleSpan(android.graphics.Typeface.BOLD), 2022, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);  //粗体
071         msp.setSpan(new StyleSpan(android.graphics.Typeface.ITALIC), 2224, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);  //斜体
072         msp.setSpan(new StyleSpan(android.graphics.Typeface.BOLD_ITALIC), 24,27, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);  //粗斜体
073  
074         //设置下划线
075         msp.setSpan(new UnderlineSpan(), 2730, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
076  
077         //设置删除线
078         msp.setSpan(new StrikethroughSpan(), 3033, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
079  
080         //设置上下标
081         msp.setSpan(new SubscriptSpan(), 3435, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);     //下标
082         msp.setSpan(new SuperscriptSpan(), 3637, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);   //上标           
083  
084         //超级链接(需要添加setMovementMethod方法附加响应)
085         msp.setSpan(new URLSpan("tel:4155551212"), 3739, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);     //电话
086         msp.setSpan(new URLSpan("mailto:webmaster@google.com"), 3941, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);     //邮件
087         msp.setSpan(new URLSpan("http://www.baidu.com"), 4143, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);     //网络
088         msp.setSpan(new URLSpan("sms:4155551212"), 4345, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);     //短信   使用sms:或者smsto:
089         msp.setSpan(new URLSpan("mms:4155551212"), 4547, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);     //彩信   使用mms:或者mmsto:
090         msp.setSpan(new URLSpan("geo:38.899533,-77.036476"), 4749, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);     //地图  
091  
092         //设置字体大小(相对值,单位:像素) 参数表示为默认字体宽度的多少倍
093         msp.setSpan(new ScaleXSpan(2.0f), 4951, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); //2.0f表示默认字体宽度的两倍,即X轴方向放大为默认字体的两倍,而高度不变
094  
095         //设置字体(依次包括字体名称,字体大小,字体样式,字体颜色,链接颜色)
096         ColorStateList csllink = null;
097         ColorStateList csl = null;
098         XmlResourceParser xppcolor=getResources().getXml (R.color.color);
099         try {
100             csl= ColorStateList.createFromXml(getResources(),xppcolor);
101         }catch(XmlPullParserException e){
102             // TODO: handle exception
103             e.printStackTrace();
104         }catch(IOException e){
105             // TODO: handle exception
106             e.printStackTrace();
107         }
108  
109         XmlResourceParser xpplinkcolor=getResources().getXml(R.color.linkcolor);
110         try {
111             csllink= ColorStateList.createFromXml(getResources(),xpplinkcolor);
112         }catch(XmlPullParserException e){
113             // TODO: handle exception
114             e.printStackTrace();
115         }catch(IOException e){
116             // TODO: handle exception
117             e.printStackTrace();
118         }
119         msp.setSpan(newTextAppearanceSpan("monospace",android.graphics.Typeface.BOLD_ITALIC, 30, csl, csllink), 5153, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
120  
121         //设置项目符号
122         msp.setSpan(newBulletSpan(android.text.style.BulletSpan.STANDARD_GAP_WIDTH,Color.GREEN), 0,msp.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); //第一个参数表示项目符号占用的宽度,第二个参数为项目符号的颜色
123  
124         //设置图片
125         Drawable drawable = getResources().getDrawable(R.drawable.icon);
126         drawable.setBounds(00, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());
127         msp.setSpan(new ImageSpan(drawable), 5357, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
128  
129         mTextView.setText(msp);
130         mTextView.setMovementMethod(LinkMovementMethod.getInstance());
131     }
132 }



来自 :  http://www.oschina.net/question/157182_49387
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值