zoukankan      html  css  js  c++  java
  • 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文本内容。

  • 相关阅读:
    1046 Shortest Distance (20 分)(模拟)
    1004. Counting Leaves (30)PAT甲级真题(bfs,dfs,树的遍历,层序遍历)
    1041 Be Unique (20 分)(hash散列)
    1036 Boys vs Girls (25 分)(查找元素)
    1035 Password (20 分)(字符串处理)
    1044 Shopping in Mars (25 分)(二分查找)
    onenote使用小Tip总结^_^(不断更新中...)
    1048 Find Coins (25 分)(hash)
    三个故事
    领导者的举止
  • 原文地址:https://www.cnblogs.com/lsc183/p/4460799.html
Copyright © 2011-2022 走看看