- 浏览: 94179 次
- 性别:
- 来自: 北京
文章分类
最新评论
SpannableStringBuilder 和 SpannableString(转)
EditText:
通常用于显示文字,但有时候也需要在文字中夹杂一些图片,比如QQ中就可以使用表情图片,又比如需要的文字高亮显示等等,如何在android中也做到这样呢?
记得android中有个android.text包,这里提供了对文本的强大的处理功能。
添加图片主要用SpannableString和ImageSpan类:
有的时候可能只想用一个textview来表示文字,但文字里肯定有分不同内容的东西,需要用不同的颜色、样式来表示.
这个时候,就需要用到SpannableString对象来处理。
关键方法:
public void setSpan (Object what, int start, int end, int flags)
start是起始位置,无论中英文,都算一个。从0开始计算起。end是结束位置,所以处理的文字,包含开始位置,但不包含结束位置。
将需要的文字高亮显示:
加下划线:
组合运用:
案例:带有\n换行符的字符串都可以用此方法显示2种颜色
以上实际都是Html.fromHtml(html)的代码实现形式。
=============================================================================
TextView: (方法与EditView类似)
如何让一个TextView中的关键字高亮显示?
通常用于显示文字,但有时候也需要在文字中夹杂一些图片,比如QQ中就可以使用表情图片,又比如需要的文字高亮显示等等,如何在android中也做到这样呢?
记得android中有个android.text包,这里提供了对文本的强大的处理功能。
添加图片主要用SpannableString和ImageSpan类:
Drawable drawable = getResources().getDrawable(id); drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight()); //需要处理的文本,[smile]是需要被替代的文本 SpannableString spannable = new SpannableString(getText().toString() +"[smile]"); //要让图片替代指定的文字就要用ImageSpan ImageSpan span = new ImageSpan(drawable, ImageSpan.ALIGN_BASELINE); //开始替换,注意第2和第3个参数表示从哪里开始替换到哪里替换结束(start和end) //最后一个参数类似数学中的集合,[5,12)表示从5到12,包括5但不包括12 spannable.setSpan(span, getText().length(),getText().length() +"[smile]".length(), Spannable.SPAN_INCLUSIVE_EXCLUSIVE); setText(spannable);
有的时候可能只想用一个textview来表示文字,但文字里肯定有分不同内容的东西,需要用不同的颜色、样式来表示.
这个时候,就需要用到SpannableString对象来处理。
/** * new StrikethroughSpan() //设置删除线 * new URLSpan("http://www.baidu.com")//http超链接 * new URLSpan("tel:4155551212")//电话超链接 */ mTextView = (TextView)findViewById(R.id.test); SpannableString tSS = new SpannableString(“SpannableString学习中”); tSS.setSpan(new BackgroundColorSpan(Color.RED), 0, 2, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); //红色高亮 tSS.setSpan(new UnderlineSpan(), 15, 18,Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); //下划线 tSS.setSpan(new StyleSpan(android.graphics.Typeface.BOLD_ITALIC), 2, 5, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); //斜体 mTextView.setText(tSS);
关键方法:
public void setSpan (Object what, int start, int end, int flags)
start是起始位置,无论中英文,都算一个。从0开始计算起。end是结束位置,所以处理的文字,包含开始位置,但不包含结束位置。
将需要的文字高亮显示:
public void highlight(int start,int end){ SpannableStringBuilder spannable= new SpannableStringBuilder(getText().toString());//用于可变字符串 ForegroundColorSpan span=new ForegroundColorSpan(Color.RED); spannable.setSpan(span, start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); setText(spannable); }
加下划线:
public void underline(int start,int end){ SpannableStringBuilder spannable= new SpannableStringBuilder(getText().toString()); CharacterStyle span=new UnderlineSpan(); spannable.setSpan(span, start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); setText(spannable); }
组合运用:
SpannableStringBuilder spannable= new SpannableStringBuilder(getText().toString()); CharacterStyle span_1=new StyleSpan(android.graphics.Typeface.ITALIC); CharacterStyle span_2=new ForegroundColorSpan(Color.RED); spannable.setSpan(span_1, start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); spannable.setSpan(span_2, start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); setText(spannable);
案例:带有\n换行符的字符串都可以用此方法显示2种颜色
/** * 带有\n换行符的字符串都可以用此方法显示2种颜色 * @param text * @param color1 * @param color2 * @return */ public SpannableStringBuilder highlight(String text,int color1,int color2,int fontSize){ SpannableStringBuilder spannable=new SpannableStringBuilder(text);//用于可变字符串 CharacterStyle span_0=null,span_1=null,span_2; int end=text.indexOf("\n"); if(end==-1){//如果没有换行符就使用第一种颜色显示 span_0=new ForegroundColorSpan(color1); spannable.setSpan(span_0, 0, text.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); }else{ span_0=new ForegroundColorSpan(color1); span_1=new ForegroundColorSpan(color2); spannable.setSpan(span_0, 0, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); spannable.setSpan(span_1, end+1, text.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); span_2=new AbsoluteSizeSpan(fontSize);//字体大小 spannable.setSpan(span_2, end+1, text.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); } return spannable; }
以上实际都是Html.fromHtml(html)的代码实现形式。
=============================================================================
TextView: (方法与EditView类似)
如何让一个TextView中的关键字高亮显示?
/** * 关键字高亮显示 * @param target 需要高亮的关键字 */ public void highlight(String target){ String temp=getText().toString(); SpannableStringBuilder spannable = new SpannableStringBuilder(temp); CharacterStyle span=null; Pattern p = Pattern.compile(target); Matcher m = p.matcher(temp); while (m.find()) { span = new ForegroundColorSpan(Color.RED);//需要重复! //span = new ImageSpan(drawable,ImageSpan.XX);//设置现在图片 spannable.setSpan(span, m.start(), m.end(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); } setText(spannable); }
发表评论
-
Android涉及到的设计模式
2015-03-17 16:59 4811、适配器模式:ListView或GridView的Ada ... -
Android4.4 从图库选图返回
2014-02-14 19:06 1875private View.OnClickListener ... -
Android 右滑关闭当前Activity(类微信)
2013-11-14 15:34 13357主要原理为监控触屏事件和手势事件,在触屏事件处理函数中调用手 ... -
NDK,JNI (前言)
2013-07-29 19:55 7021JNI是Java Native Interface的缩写, ... -
NDK,JNI (前言)
2013-07-29 19:51 21JNI是Java Native Interface的缩写,译 ... -
哈哈,考试题
2013-04-28 18:02 701Java 相关: Q1. 接口是否可继承接口?抽象类是否 ... -
小知识点积累
2013-04-18 15:00 1641android中EditText的字数统计取巧方式: ... -
NDK,JNI 积累
2013-03-04 12:31 1179使用javah 将某一个含有native方法的class ... -
小错误(怪异问题)积累
2012-11-06 16:00 852写道 用eclipse编译程序,然后在android ... -
loadIcon 和 getApplicationIcon
2012-08-07 14:25 39452012年8月7日 13:50 今天在修复Tes ... -
由SingleInstance和SingleTask引发的 问题
2012-06-29 10:56 2513引用 Q1: Activity A 设置模式为SingleI ... -
关于Cursor的遇见的错误描述
2012-06-15 18:54 1131【解决】android.database.CursorInde ... -
Android 使用xliff 格式化字符串
2012-04-18 11:41 6141Android资源字符串/res/values/stri ... -
Android MMS模块数据存取 (转)
2012-04-01 10:45 6056数据表 MMS 模块总共包含 17 ... -
Bitmap Drawable
2012-03-28 14:36 1915Drawable和 Bitmap 的区别: ... -
收藏的优秀代码
2012-03-27 11:38 732实现类似手机QQ的可折叠固定标题列表 PinnedHeade ... -
2012年遇到的笔试题
2012-03-02 00:48 1670一、选择题 1.java.io包中定义了多个流类型来实现输入和 ... -
Android学习笔记之AndroidManifest.xml文件解析(转)
2011-12-03 01:17 804一、关于AndroidManifest.xml Android ... -
java关键字Transient 学习
2011-12-02 22:51 730Java的serialization提供了一种持久化对象实例的 ... -
Error generating final archive: Debug Certificate expired on 问题
2011-11-09 19:24 1908Error generating final archive: ...
相关推荐
博客《SpannableString与SpannableStringBuilder》对应源码,博客地址:http://blog.csdn.net/harvic880925/article/details/38984705
今天稍微整理下SpannableString与SpannableStringBuilder,因为在上篇中,我们曾讲到过有关CharSequence的东东,有关CharSequence的话,这两个类是必谈的,所以这里加以整理。 一、概述 1、SpannableString、...
SpannableStringBuilder让TextView实现炫酷效果
GridView+SpannableStringBuilder 实现表情展示和TextView显示表情png
图文混排,SpannableStringBuilder,stringbuilder的使用
SpannableStringBuilder 用法demo,仿陌陌表情插入
提供SpannableStringBuilder的简单使用,分享给大家,希望能够帮到需要的人!
A helper class that extends SpannableStringBuilder and adds methods to easily mark the text with multiple spans. Download You can just copy the class to your project or grab it via Gradle: compile '...
文本样式设置之SpannableString类的应用
> Kotlin wrappers around SpannableStringBuilder. Inspired by binaryfork's Spanny. SpannableStringBuilder API is attractive, it's a nice way to styling text without split your text into multiple views,...
学习SpannableString&&SpannableStringBuilder的资料
使用链式结构组成SpannableStringBuilder。使得结构上更加清晰,使用时更加方便。 使用对比 代码对比: //链式结构 private fun initContentTop() { RichText.Builder(this) .backColor(1, 4, Color.RED) ....
2.正解来了,使用SpannableString或SpannableStringBuilder,这两个类专门用于字体样式设置,可以更改颜色,设置点击事件等。 用法: SpannableString spannableString=new SpannableString(This is a partly click...
NULL 博文链接:https://breaklayer.iteye.com/blog/738596
化妆品 Android上SpannableStringBuilder的包装器
https://blog.csdn.net/hugn215/article/details/81035510
EditText结合SpannableStringBuilder,添加图片和自定义文字等实例。
短语样式示例 演示使用文本样式的几种...您可以从代码中做同样的事情,使用SpannableString或SpannableStringBuilder来定义样式: ![手动创建span](截图/手动创建span.png) 截屏 ![截图](截图/短语样式示例截图.png)