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

2020-01-15  本文已影响0人  GXT_Star

废话不多说,上图看栗子

SpannableStringBuilder
主要是用到SpannableStringBuilder这个类,可以对文字进行简单配置:
/*  设置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了。

上一篇下一篇

猜你喜欢

热点阅读