实现在一个TextView里显示了一行字符串,需要这个串里字符显示不同颜色,超链接,图片等html常用的功能.

​​​

方式一:加载html格式的字符串

TextView mTextView;String str = "<font color='red'><b>知道螃蟹为什么横着走吗?</b></font><font color='blue'><b>因为有钱,所以任性。</b></font>";mTextView.setText(Html.fromHtml(str));

说明:
android 支持的Html标签
<a href="..."> 定义链接内容
<b> 定义粗体文字 b 是blod的缩写
<big> 定义大字体的文字
<blockquote> 引用块标签
属性:
Common -- 一般属性
cite -- 被引用内容的URI
<br> 定义换行
<cite> 表示引用的URI
<dfn> 定义标签 dfn 是defining instance的缩写
<div align="...">
<em> 强调标签 em 是emphasis的缩写
<font size="..." color="..." face="...">
<h1><h2><h3><h4><h5><h6> 标题等级
<i> 定义斜体文字
<img src="...">
<p> 段落标签,里面可以加入文字,列表,表格等
<small> 定义小字体的文字
<strike> 定义删除线样式的文字 不符合标准网页设计的理念,不赞成使用. strike是strikethrough的缩写
<strong> 重点强调标签
<sub> 下标标签 sub 是subscript的缩写
<sup> 上标标签 sup 是superscript的缩写
<tt> 定义monospaced字体的文字 不赞成使用. 此标签对中文没意义 tt是teletype or monospaced text style的意思
<u> 定义带有下划线的文字 u是underlined text style的意思




方式二:使用Spannable

String strs="红色打电话粗体删除线绿色下划线图片:.超链接红色背景色斜体";       SpannableString ss = new SpannableString( strs);    ss.setSpan(new ForegroundColorSpan(Color.RED), 0, 2,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);    ss.setSpan(new URLSpan("tel:4155551212"), 2, 5,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);ss.setSpan(new StyleSpan(Typeface.BOLD), 5, 7, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);    ss.setSpan(new StrikethroughSpan(), 7, 10,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);    ss.setSpan(new UnderlineSpan(), 10, 16,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);    ss.setSpan(new ForegroundColorSpan(Color.GREEN), 10, 15, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);    Drawable d = getResources().getDrawable(R.drawable.icon48x48_1);     d.setBounds(0, 0, d.getIntrinsicWidth(), d.getIntrinsicHeight());     ImageSpan span = new ImageSpan(d, ImageSpan.ALIGN_BASELINE);     ss.setSpan(span, 18, 19, Spannable.SPAN_INCLUSIVE_EXCLUSIVE); ss.setSpan(new URLSpan("http://www.baidu.com"), 19, 22,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);sp.setSpan(new BackgroundColorSpan(Color.RED), 22 ,26,Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);         sp.setSpan(new StyleSpan(android.graphics.Typeface.BOLD_ITALIC), 26, 28, Spannable.SPAN_EXCLUSIVE_INCLUSIVE);TextView t4 = (TextView) findViewById(R.id.text4);    t4.setText(ss);    t4.setMovementMethod(LinkMovementMethod.getInstance());


运行结果:


参数说明:
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
API里面解释:Spans of type SPAN_EXCLUSIVE_EXCLUSIVE do not expand to include text inserted at either their starting or ending point. They can never have a length of 0 and are automatically removed from the buffer if all the text they cover is removed.
即在原文本头或尾追加新文本的样式不受原文本样式影响,原文本高亮,新追加文本不高亮。


Spannable.SPAN_EXCLUSIVE_INCLUSIVE
API里面解释:Non-0-length spans of type SPAN_INCLUSIVE_EXCLUSIVE expand to include text inserted at their ending point but not at their starting point. When 0-length, they behave like points.

即在原文本尾追加新文本的样式受原文本样式影响,原来文本尾高亮,新追加文本也高亮。看个截图就更明白了:



对比一下


简单例子(实现文字高亮,点击响应点击事件)

下面是一个20行的完整Demo代码:基本原理是使用一个SpannableString并设置其ClickableSpan来响应点击事件。        TextView useInfo = (TextView) findViewById(R.id.info);        String url_0_text = "用户协议及隐私条款";        useInfo.setText("开始即表示您同意遵守");        SpannableString spStr = new SpannableString(url_0_text);        spStr.setSpan(new ClickableSpan() {            @Override            public void updateDrawState(TextPaint ds) {                super.updateDrawState(ds);                ds.setColor(Color.WHITE);       //设置文件颜色                ds.setUnderlineText(true);      //设置下划线            }            @Override            public void onClick(View widget) {                Log.d("", "onTextClick........");            }        }, 0, url_0_text.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);        useInfo.setHighlightColor(Color.TRANSPARENT); //设置点击后的颜色为透明,否则会一直出现高亮        useInfo.append(spStr);        useInfo.setMovementMethod(LinkMovementMethod.getInstance());//开始响应点击事件



方式三:

在项目开发者,经常需要把资源文件定义字符串和设置颜色结合起来使用。可以避免很多textview的拼接,如下所示:
res字符串文件定义: <string name="baoxiang">您今天打了%1$d局,还差%2$d局可获得%3$s!</string>


TextView textView = (TextView)findViewById(R.id.testview);
String text = String.format(getResources().getString(R.string.baoxiang), 2,18,"银宝箱");
int index[] = new int[3];
index[0] = text.indexOf("2");
index[1] = text.indexOf("18");
index[2] = text.indexOf("银宝箱");
SpannableStringBuilder style=new SpannableStringBuilder(text);
style.setSpan(new ForegroundColorSpan(Color.RED),index[0],index[0]+1,Spannable.SPAN_EXCLUSIVE_INCLUSIVE);
style.setSpan(new ForegroundColorSpan(Color.RED),index[1],index[1]+2,Spannable.SPAN_EXCLUSIVE_INCLUSIVE);
style.setSpan(new BackgroundColorSpan(Color.RED),index[2],index[2]+3,Spannable.SPAN_EXCLUSIVE_INCLUSIVE);
textView.setText(style);





更多相关文章

  1. 【读书笔记《Android游戏编程之从零开始》】5.Android(安卓)游戏
  2. android - 自定义(组合)控件 + 自定义控件外观
  3. Android(安卓)-- Autosizing TextView 自动调整文字大小
  4. android 下自定义view, android.view.InflateException
  5. Android的语言设置(二)
  6. Android项目构建之build.gradle配置与打包
  7. Android(安卓)自定义方形验证码输入框,仿滴滴、小篮单车
  8. android 两个listView 共存的显示问题
  9. Android自定义View-圆形图片控件

随机推荐

  1. Android(安卓)Google地图那些事
  2. Android:根据上下文Context获取Activity
  3. Error:(1, 0) Your project path contain
  4. android 获取手机位置信息
  5. Android(安卓)滑动效果代码分享
  6. android图片下载工具类
  7. android启动和推出实现侧滑效果
  8. 【Android】打开/读取文件的方法
  9. Android中通过代码检测系统是否有root权
  10. Android的设计模式