Andriod给textview文本关键字循环标亮加粗

  在开发中,搜索到得关键字信息在展示时,通常需要标亮加粗,如下图(截取自蓝鲸医生助手搜索后的结果)

  

  在文本中,关键字是“嘎”,所有“嘎”字都标亮加粗,标亮就是换种颜色。这里就要用到SpannableStringBuilder。首先SpannableString、SpannableStringBuilder基本上与String差不多,也是用来存储字符串,但它们俩的特殊就在于有一个SetSpan()函数,能给这些存储的String添加各种格式或者称样式(Span),将原来的String以不同的样式显示出来,比如在原来String上加下划线、加背景色、改变字体颜色、用图片把指定的文字给替换掉,等等。所以,总而言之,SpannableString、SpannableStringBuilder与String一样, 首先也是传字符串,但SpannableString、SpannableStringBuilder可以对这些字符串添加额外的样式信息,但String则不行。

  SpannableString和SpannableStringBuilder的区别在于 SpannableString像一个String一样,构造对象的时候传入一个String,之后再无法更改String的内容,也无法拼接多个 SpannableString;而SpannableStringBuilder则更像是StringBuilder,它可以通过其append()方法来拼接多个String:

  

//使用SpannableString,只能作为构造函数参数传入
SpannableString word = new SpannableString("欢迎光临lsc183的博客");  

//使用SpannableStringBuilder,可以使用append()再追加
SpannableStringBuilder multiWord = new SpannableStringBuilder();
multiWord.append("欢迎光临");
multiWord.append("lsc183的");
multiWord.append("博客");  

  SpannableString和SpannableStringBuilder通过TextView.setText()设置给TextView。

  各种span设置:

  在前面的一个小示例,大家应该也可以看出,要应用一个Span总共分三步:
    1、构造String
    2、构造Span
    3、利用SetSpan()对指定范围的String应用这个Span

  1、字体颜色设置(ForegroundColorSpan)

SpannableString spanString = new SpannableString("欢迎光临lsc183的博客");
//再构造一个改变字体颜色的Span
ForegroundColorSpan span = new ForegroundColorSpan(Color.BLUE);
//将这个Span应用于指定范围的字体
spanString.setSpan(span, 1, 5, Spannable.SPAN_EXCLUSIVE_INCLUSIVE);
//设置给EditText显示出来
editText.setText(spanString);  

  2、字体背景颜色(BackgroundColorSpan)

SpannableString spanString = new SpannableString("欢迎光临lsc183的博客");
BackgroundColorSpan span = new BackgroundColorSpan(Color.YELLOW);
spanString.setSpan(span, 0, 3, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
editText.setText(spanString);  

  3、字体大小(AbsoluteSizeSpan)

SpannableString spanString = new SpannableString("欢迎光临lsc183的博客");
AbsoluteSizeSpan span = new AbsoluteSizeSpan(16);
spanString.setSpan(span, 2, 5, Spannable.SPAN_INCLUSIVE_INCLUSIVE);
editText.setText(spanString);

  4、粗体、斜体(StyleSpan)

SpannableString spanString = new SpannableString("欢迎光临lsc183的博客");
StyleSpan span = new StyleSpan(Typeface.BOLD_ITALIC);
spanString.setSpan(span, 1, 4, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
editText.setText(spanString);  

  5、删除线(StrikethroughSpan)

SpannableString spanString = new SpannableString("欢迎光临lsc183的博客");
StrikethroughSpan span = new StrikethroughSpan();
spanString.setSpan(span, 2, 5, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
editText.setText(spanString); 

  6、下划线(UnderlineSpan)

SpannableString spanString = new SpannableString("欢迎光临lsc183的博客");
UnderlineSpan span = new UnderlineSpan();
spanString.setSpan(span, 1, 4, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
editText.setText(spanString); 

  7、图片置换(ImageSpan)

SpannableString spanString = new SpannableString("欢迎光临lsc183的博客");
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, 2, 4, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
editText.setText(spanString);   

  如果要标亮的关键字不止一个,有多个呢,就像要标注“欢迎光临光临lsc183的博客,博客”,标注“博”呢,那就需要循环了。这里提供一个方法:

public static void setTextviewColorAndBold(TextView textView, String key, String value) {
        if (TCommUtil.isNull(value)) {
            return;
        }
        if (!TCommUtil.isNull(key)) {
            SpannableStringBuilder style = new SpannableStringBuilder(value);
            int index = value.indexOf(key);
            if (index >= 0) {
                while (index < value.length() && index >= 0) {
                    style.setSpan(new ForegroundColorSpan(Color.rgb(0, 187, 33)), index, index + key.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
                    style.setSpan(new StyleSpan(Typeface.BOLD), index, index + key.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
                    textView.setText(style);
                    index = value.indexOf(key, index + key.length());
                }
            } else {
                textView.setText(value);
            }

        } else {
            textView.setText(value);
        }
    }

  注:key要标亮的关键字,value文本内容。

时间: 2024-10-29 05:06:30

Andriod给textview文本关键字循环标亮加粗的相关文章

Android学习笔记-TextView(文本框)(一)

参考自文章:http://www.runoob.com/w3cnote/android-tutorial-textview.html 1.基础属性详解: id:为TextView设置一个组件id,根据id,我们可以在Java代码中通过findViewById()的方法获取到该对象,然后进行相关属性的设置,又或者使用RelativeLayout时,参考组件用的也是id! layout_width:组件的宽度,一般写:**wrap_content**或者**match_parent(fill_par

Android基础入门教程——2.3.1 TextView(文本框)详解

Android基础入门教程--2.3.1 TextView(文本框)详解 标签(空格分隔): Android基础入门教程 本节引言: 学习完Android中的六大布局,从本节开始我们来一个个讲解Android中的UI控件,本节给大家带来的UI控件是:TextView(文本框),用于显示文本的一个控件,另外声明一点,我不是翻译API文档,不会一个个属性的去扣,只学实际开发中常用的,有用的,大家遇到感觉到陌生的属性可以查询对应的API!当然,每一节开始都会贴这一节对应API文档的链接:TextVie

步步为营_Android开发课[15]_用户界面之TextView(文本视图)

Focus on technology, enjoy life!-- QQ:804212028 浏览链接:http://blog.csdn.net/y18334702058/article/details/44624305 主题:用户界面之TextView(文本视图) TextView控件实例: activity_main.xml源代码: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xm

(五十)TextView文本滚动效果实现

一.若要让TextView里的文本滚动,必须满足以下几个因素: 1.TextView里文本宽度超过TextView的宽度2.android:ellipsize="marquee"(实现跑马灯效果)3.只有在TextView获取到焦点时,才会滚动.所以加上android:focusableInTouchMode="true"  android:focusable="true",最容易忽略的是此条. 4.滚动重复次数设置:android:marque

3.3.1 TextView(文本框)

3.3.1 TextView(文本框) 本文声明: 本文由Coder-pig编写,想了解其他内容,可见CoderPig's Android Study Note--目录 尊重作者劳动成果,未经本人授权,禁止转载!违者必究! 目录源地址:http://blog.csdn.net/coder_pig/article/details/51348769 1.基本属性 id:为TextView设置一个组件id,根据id,我们可以在Java代码中通过findViewById()的方法 获取到该对象,然后进行

2.3.1 TextView(文本框)详解

本节引言: 学习完Android中的六大布局,从本节开始我们来一个个讲解Android中的UI控件,本节给大家带来的UI控件是:TextView(文本框),用于显示文本的一个控件,另外声明一点,我不是翻译API文档,不会一个个属性的去扣,只学实际开发中常用的,有用的,大家遇到感觉到陌生的属性可以查询对应的API!当然,每一节开始都会贴这一节对应API文档的链接:TextView API 好了,在开始本节内容前,先要介绍下几个单位: dp(dip): device independent pixe

android如果给TextView或EditText的email链接加下划线,并在点击在email连接上可以弹框显示

如何把textview的一些文字加上背景色: Spannable str = new SpannableString("#fdsfdfsdfdsfd#"); Matcher matcher = getEmailPattern().matcher((CharSequence) str); while (matcher.find()) { int start = matcher.start(); int end = matcher.end(); str.setSpan(new Foregr

The usage of Markdown---文字强调:加粗/斜体/文本高亮/删除线/下划线/按键效果

更新时间:2019.09.14 1. 序言 有时候,我们需要对某些文字进行强调,例如粗体和斜体.而Markdown通常可以使用星号*或者下划线_进行文字强调. 2. 加粗 如果想要达到加粗的效果,可以使用一组**和__包围着你想加粗的内容,例如**加粗**或者__加粗__--->效果:加粗或者 加粗 ps:在博客园中如果使用__加粗__,而前面紧跟着文字时并不会生效,需要加一个空格才行.但如果前面是符号,则能够正常显示. 例:我想__加粗__(前面没有加空格),我想(没有加空格)加粗,我想 加粗

Android学习笔记-TextView(文本框)(二)

文章参考自:http://www.runoob.com/w3cnote/android-tutorial-textview.html 2.4 使用autoLink属性识别链接类型 当文字中出现了URL,E-Mail,电话号码,地图的时候,我们可以通过设置autoLink属性:当我们点击 文字中对应部分的文字,即可跳转至某默认APP,比如一串号码,点击后跳转至拨号界面! all就是全部都包含,自动识别协议头~ 在Java代码中可以调用setAutoLinkMask(Linkify.ALL); 这个