Android TextView 设置超链接、关键字高亮等效果

之前做TextView关键字高亮效果,使用的是Html.fromHtml(String source)方法,然后通过TextView的setText(CharSequence text)方法来显示




后来测试此方法在部分手机上显示有问题,如Nexus4,华为P6等等。于是乎只能继续寻找别的解决办法了,在这里Mark一下。

这里用到了SpannableString类



使用 SpannableString.setSpan(Object what, int start, int end, int flags)方法



1、创建超链接

  1. /** 
  2.      * 创建一个超链接 
  3.      */  
  4.     private void createLink() {  
  5.         // 创建一个 SpannableString对象  
  6.         SpannableString sp = new SpannableString(“百度手机卫士”);  
  7.         // 设置超链接  
  8.         sp.setSpan(new URLSpan(“http://www.baidu.com”), 02,  
  9.                 Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);  
  10.           
  11.         tv_content1.setText(sp);  
  12.         //设置TextView可点击    
  13.         tv_content1.setMovementMethod(LinkMovementMethod.getInstance());    
  14.     }  
/**
     * 创建一个超链接
     */
    private void createLink() {
        // 创建一个 SpannableString对象
        SpannableString sp = new SpannableString("百度手机卫士");
        // 设置超链接
        sp.setSpan(new URLSpan("http://www.baidu.com"), 0, 2,
                Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

        tv_content1.setText(sp);
        //设置TextView可点击  
        tv_content1.setMovementMethod(LinkMovementMethod.getInstance());  
    }


2、高亮某一段文字的背景

  1. //高亮背景颜色  
  2.     private void backgroundHight(){  
  3.         // 创建一个 SpannableString对象  
  4.         SpannableString sp = new SpannableString(“祝大家新年快乐”);  
  5.         //设置背景颜色  
  6.         sp.setSpan(new BackgroundColorSpan(Color.RED), 3 ,5,Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);    
  7.         tv_content2.setText(sp);  
  8.         //设置TextView可点击    
  9.         tv_content2.setMovementMethod(LinkMovementMethod.getInstance());    
  10.     }  
//高亮背景颜色
    private void backgroundHight(){
        // 创建一个 SpannableString对象
        SpannableString sp = new SpannableString("祝大家新年快乐");
        //设置背景颜色
        sp.setSpan(new BackgroundColorSpan(Color.RED), 3 ,5,Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);  
        tv_content2.setText(sp);
        //设置TextView可点击  
        tv_content2.setMovementMethod(LinkMovementMethod.getInstance());  
    }


3、高亮某段文字

  1. //高亮字体颜色  
  2.     private void foregroundHight(){  
  3.         // 创建一个 SpannableString对象  
  4.         SpannableString sp = new SpannableString(“祝大家新年快乐”);  
  5.         //设置背景颜色  
  6.         sp.setSpan(new ForegroundColorSpan(Color.parseColor(“#ff6600”)), 3 ,5,Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);    
  7. //      sp.setSpan(new ForegroundColorSpan(Color.YELLOW), 3 ,5,Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);    
  8.         tv_content3.setText(sp);  
  9.         //设置TextView可点击    
  10.         tv_content3.setMovementMethod(LinkMovementMethod.getInstance());    
  11.     }  
//高亮字体颜色
    private void foregroundHight(){
        // 创建一个 SpannableString对象
        SpannableString sp = new SpannableString("祝大家新年快乐");
        //设置背景颜色
        sp.setSpan(new ForegroundColorSpan(Color.parseColor("#ff6600")), 3 ,5,Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);  
//      sp.setSpan(new ForegroundColorSpan(Color.YELLOW), 3 ,5,Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);  
        tv_content3.setText(sp);
        //设置TextView可点击  
        tv_content3.setMovementMethod(LinkMovementMethod.getInstance());  
    }


4、设置斜体

  1. //斜体  
  2.     private void boldItalicHight(){  
  3.         // 创建一个 SpannableString对象  
  4.         SpannableString sp = new SpannableString(“新年快乐天天开心 哈哈哈哈哈哈”);  
  5. //      SpannableString sp = new SpannableString(“Happy New Year 天天开心 哈哈哈哈哈哈”);  
  6.         //设置背景颜色  
  7.         sp.setSpan(new StyleSpan(Typeface.BOLD_ITALIC), 6 ,10,Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);    
  8.         tv_content4.setText(sp);  
  9.         //设置TextView可点击    
  10.         tv_content4.setMovementMethod(LinkMovementMethod.getInstance());    
  11.     }  
//斜体
    private void boldItalicHight(){
        // 创建一个 SpannableString对象
        SpannableString sp = new SpannableString("新年快乐天天开心 哈哈哈哈哈哈");
//      SpannableString sp = new SpannableString("Happy New Year 天天开心 哈哈哈哈哈哈");
        //设置背景颜色
        sp.setSpan(new StyleSpan(Typeface.BOLD_ITALIC), 6 ,10,Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);  
        tv_content4.setText(sp);
        //设置TextView可点击  
        tv_content4.setMovementMethod(LinkMovementMethod.getInstance());  
    }


这里设置的斜体只对 英文起作用,汉字没有斜体效果,如果有人知道原因,麻烦在下面回复我一下,谢谢!

5、设置下划线

  1. //下划线  
  2.     private void underLineHight(){  
  3.         // 创建一个 SpannableString对象  
  4.         SpannableString sp = new SpannableString(“祝大家新年快乐”);  
  5.         //设置背景颜色  
  6.         sp.setSpan(new UnderlineSpan(), 3 ,5,Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);    
  7.         tv_content5.setText(sp);  
  8.         //设置TextView可点击    
  9.         tv_content5.setMovementMethod(LinkMovementMethod.getInstance());    
  10.     }  
//下划线
    private void underLineHight(){
        // 创建一个 SpannableString对象
        SpannableString sp = new SpannableString("祝大家新年快乐");
        //设置背景颜色
        sp.setSpan(new UnderlineSpan(), 3 ,5,Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);  
        tv_content5.setText(sp);
        //设置TextView可点击  
        tv_content5.setMovementMethod(LinkMovementMethod.getInstance());  
    }


6、设置中划线

  1. //中划线  
  2.     private void strikethroughHight(){  
  3.         // 创建一个 SpannableString对象  
  4.         SpannableString sp = new SpannableString(“祝大家新年快乐”);  
  5.         //设置背景颜色  
  6.         sp.setSpan(new StrikethroughSpan(), 3 ,5,Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);    
  7.         tv_content6.setText(sp);  
  8.         //设置TextView可点击    
  9.         tv_content6.setMovementMethod(LinkMovementMethod.getInstance());    
  10.     }  
//中划线
    private void strikethroughHight(){
        // 创建一个 SpannableString对象
        SpannableString sp = new SpannableString("祝大家新年快乐");
        //设置背景颜色
        sp.setSpan(new StrikethroughSpan(), 3 ,5,Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);  
        tv_content6.setText(sp);
        //设置TextView可点击  
        tv_content6.setMovementMethod(LinkMovementMethod.getInstance());  
    }


7、高亮一段文字中指定的全部关键字

  1. /** 
  2.      * 高亮某个关键字,如果有多个则全部高亮 
  3.      */  
  4.     private void highlightKeyword() {  
  5.           
  6.         String str = ”KTV风暴KTV”;  
  7.         SpannableString sp = new SpannableString(str);  
  8.           
  9.         Pattern p = Pattern.compile(”KTV”);  
  10.         Matcher m = p.matcher(str);  
  11.   
  12.         while (m.find()) {  //通过正则查找,逐个高亮  
  13.             int start = m.start();  
  14.             int end = m.end();  
  15.             sp.setSpan(new ForegroundColorSpan(Color.parseColor(“#ff6600”)), start ,end,Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);    
  16.         }  
  17.         tv_content7.setText(sp);  
  18.     }  
/**
     * 高亮某个关键字,如果有多个则全部高亮
     */
    private void highlightKeyword() {

        String str = "KTV风暴KTV";
        SpannableString sp = new SpannableString(str);

        Pattern p = Pattern.compile("KTV");
        Matcher m = p.matcher(str);

        while (m.find()) {  //通过正则查找,逐个高亮
            int start = m.start();
            int end = m.end();
            sp.setSpan(new ForegroundColorSpan(Color.parseColor("#ff6600")), start ,end,Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);  
        }
        tv_content7.setText(sp);
    }



运行效果







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值