效果图:

Android TextView SpannableString样式详解_第1张图片

代码如下:

package com.androidtest;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.Color;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.ForegroundColorSpan;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 TestActivity extends Activity {private TextView mTextView;private SpannableString msp;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.test_layout);mTextView = (TextView) findViewById(R.id.text);        //创建一个 SpannableString对象            msp = new SpannableString("字体测试字体大小一半两倍前景色背景色正常粗体斜体粗斜体下划线删除线x1x2电话邮件网站短信彩信地图X轴综合");                     //设置字体(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:[email protected]"), 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.xml.colors);          try {              csl= ColorStateList.createFromXml(getResources(),xppcolor);          }catch(XmlPullParserException e){              e.printStackTrace();                  }catch(IOException e){              e.printStackTrace();                  }            XmlResourceParser xpplinkcolor=getResources().getXml(R.xml.colors);          try {              csllink= ColorStateList.createFromXml(getResources(),xpplinkcolor);          }catch(XmlPullParserException e){              e.printStackTrace();                  }catch(IOException e){              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.RED), 0 ,53, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); //第一个参数表示项目符号占用的宽度,第二个参数为项目符号的颜色                      mTextView.setText(msp);          mTextView.setMovementMethod(LinkMovementMethod.getInstance());   }}

这里需要在res目录下新建一个xml文件夹,在文件夹里面创建一个colors文件夹,即可使用最后一个功能!

XmlResourceParser的使用介绍可以参照:http://www.iteye.com/topic/1122056


也可以显示图片:

/** * 图片 */  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);  }  

Android使用TextView实现无下划线超链接:

1、重写ClickableSpan类来去掉下划线样式(系统默认使用ClickableSpan来封装超链接)

private class NoLineClickSpan extends ClickableSpan {     String text;    public NoLineClickSpan(String text) {        super();        this.text = text;    }    @Override    public void updateDrawState(TextPaint ds) {        ds.setColor(ds.linkColor);        ds.setUnderlineText(false); //去掉下划线    }    @Override    public void onClick(View widget) {         processHyperLinkClick(text); //点击超链接时调用    }}

2、把超链接文本封装为NoLineClickSpan对象,并添加到TextView中

TextView tv = findViewById(R.id.tv_click);SpannableString spStr = new SpannableString("萝卜白菜博客-->http://orgcent.com");ClickSpan clickSpan = new NoLineClickSpan(vo); //设置超链接spStr.setSpan(clickSpan, 0, str.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE);tv.append(spStr);tv.setMovementMethod(LinkMovementMethod.getInstance());

PS:不用把TextView的属性autoLink设为”all”.

3、设置超链接为可点击状态

tv.setMovementMethod(LinkMovementMethod.getInstance());

拓展补充:

当ListView的Item布局中,使用到了ClickableSpan时,将导致ListView的Item点击事件失效,解决办法如下:

在Item的根布局控件中添加:android:descendantFocusability="blocksDescendants"即可!


参考链接:

http://blog.csdn.net/u012551350/article/details/51722893?locationNum=1&fps=1





更多相关文章

  1. Android动态改变TextView字体颜色
  2. Android 自定义字体(otf,ttf等等)
  3. Android获取字体高度和设置行高
  4. Android 字体库详解
  5. Android中通过typeface设置字体
  6. Android引用ttf图标字体库
  7. Android中字体颜色的设置
  8. Android中添加思源字体/NotoSansCJK/SourceHanSans
  9. android 9.0 10.0 修改默认字体大小

随机推荐

  1. android坐标
  2. Android日语输入法Simeji使用示例
  3. Android 在桌面创建一个快捷方式
  4. android之Notification的使用
  5. Android 购物车(精仿)可删可全选与反选
  6. android 上下左右手势判断 根据别人的改
  7. Android EditText 密码输入框可见性设置
  8. android监听手机网络连接状态改变的后台
  9. Android Media Server - MediaPlayer - s
  10. Android Studio sync 失败解决方法