美文网首页
用户协议TextView中间文字改变变颜色并加点击事件

用户协议TextView中间文字改变变颜色并加点击事件

作者: GXT_Star | 来源:发表于2020-01-15 09:32 被阅读0次

    废话不多说,上图看栗子

    SpannableStringBuilder
    主要是用到SpannableStringBuilder这个类,可以对文字进行简单配置:
    • 自定义文本中文字的字体大小(包括绝对大小和相对大小)
    • BackgroundColorSpan : 文本背景色
    • ForegroundColorSpan : 文本颜色
    • StrikethroughSpan : 删除线
    • UnderlineSpan : 下划线
    • SubscriptSpan : 下标 ;SuperscriptSpan : 上标
    • ClickableSpan : 点击事件
    • 以上是一些常用的效果,并不是全部。
      代码示例:
    /*  设置TextView中间字体颜色与点击事见
     *  start   开始文字的位置 坐标从 0开始
     *  end     改变结束的位置 ,并不包括这个位置。
     *  使用BackgroundColorSpan设置背景颜色。
     */
        private void setTextInfo(TextView tv) {
          String content = tv.getText().toString();
            final SpannableStringBuilder style = new SpannableStringBuilder();
            style.append(content );//添加需要改变的文本
            ClickableSpan clickableSpan = new ClickableSpan() {
                @Override
                public void updateDrawState(@NonNull TextPaint ds) {
                    super.updateDrawState(ds);
                    ds.setUnderlineText(false);//取消点击事见字体的背景颜色
                    tv.setHighlightColor(getResources().getColor(android.R.color.transparent));
                }
        //变色字体点击监听设置
                @Override
                public void onClick(@NonNull View widget) {
    
                Toast.makeText(context,"变色字体的点击事件",Toast.LENGTH_SHORT).show();
    
                }
            };
            style.setSpan(clickableSpan, 7, 13, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
            tv.setText(style);
            ForegroundColorSpan foregroundColorSpan = new ForegroundColorSpan(Color.parseColor("#2B509B"));
            style.setSpan(foregroundColorSpan, 7, 13, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
            tv.setMovementMethod(LinkMovementMethod.getInstance());
            tv.setText(style);
        }
    
    下面是 TextView通过SpannableStringBuilder设置两处内容文字点击事件和两处字体颜色变色。
     TextView tv_content = findViewById(R.id.tv_content);
     //《隐私政策》、《使用条款》其中的内容需要设置变色和设置可点击事件
     String tv_content = "请充分阅读并理解《隐私政策》与《使用条款》。";//控件文本内容
    String  content = tv_content .getText().toString();
     tv_content.setText(updateTextStyle(content));
     
     //添加这句话,否则点击不生效 
     tv_content.setMovementMethod(LinkMovementMethod.getInstance());
    ==========================================================================
    
    //主要方法
      private SpannableStringBuilder updateTextStyle(String content) {
            SpannableStringBuilder spannableString = new SpannableStringBuilder();
            spannableString.append(content);
        
         //使用ForegroundColorSpan添加点击事件会出现冲突
            UnderlineSpan colorSpan = new UnderlineSpan() {
                @Override
                public void updateDrawState(TextPaint ds) {
                    ds.setColor(Color.parseColor("#fe9500"));//设置颜色
                }
            };
     
     
           //使用UnderlineSpan很好的兼容这个问题
            UnderlineSpan colorSpan1 = new UnderlineSpan() {
                @Override
                public void updateDrawState(TextPaint ds) {
                    ds.setColor(Color.parseColor("#fe9500"));//设置颜色
                 //   ds.setUnderlineText(false); //去掉下划线
                }
            };
     
            int privacyBeginIndex = content.indexOf("《");
            int privacyEndIndex = content.indexOf("》") + 1;
            int protocolBeginIndex = content.lastIndexOf("《");
            int protocolEndIndex = content.lastIndexOf("》") + 1;
     
     
     
            ClickableSpan privacyClickableSpan = new ClickableSpan() {
     
                @Override
                public void onClick(@NonNull View widget) {
                    Toast.makeText(MainActivity.this, "123", Toast.LENGTH_LONG).show();
     
                }
            };
     
            ClickableSpan protocolClickableSpan = new ClickableSpan() {
     
                @Override
                public void onClick(@NonNull View widget) {
                     Toast.makeText(MainActivity.this, "123", Toast.LENGTH_LONG).show();
               
                }
            };
     
            spannableString.setSpan(protocolClickableSpan, protocolBeginIndex, protocolEndIndex, Spannable.SPAN_EXCLUSIVE_INCLUSIVE);
            spannableString.setSpan(privacyClickableSpan, privacyBeginIndex, privacyEndIndex, Spannable.SPAN_EXCLUSIVE_INCLUSIVE);
     
            //字体颜色一定要放在点击事件后面,不然部分手机不会修改颜色
            spannableString.setSpan(colorSpan, protocolBeginIndex, protocolEndIndex, Spannable.SPAN_EXCLUSIVE_INCLUSIVE);
            spannableString.setSpan(colorSpan1, privacyBeginIndex, privacyEndIndex, Spannable.SPAN_EXCLUSIVE_INCLUSIVE);
     
     
            return spannableString;
        }
    

    以下两个地方的字体颜色和点击事件就OK了。

    相关文章

      网友评论

          本文标题:用户协议TextView中间文字改变变颜色并加点击事件

          本文链接:https://www.haomeiwen.com/subject/vgsaactx.html