android textview 部分文字变色以及可点击

部分参考:https://blog.csdn.net/mq2553299/article/details/78033581

原理什么的就不说了,我也不知道。用法就是下面的两个方法。

// 推荐使用这个方法
private void showAppend(@NonNull View view) {
        TextView tvAppend = view.findViewById(R.id.tv_append);
        // ##### start

        final SpannableStringBuilder full = new SpannableStringBuilder();
        String text = "{ 中间的部分,中间的部分 }";
        String head = "{\"thx\"}";
        String tail = "{ 尾巴,尾巴 }";

        String clickText1 = "张三";
        String clickText2 = "吃瓜";
        final SpannableStringBuilder before = new SpannableStringBuilder();
        final SpannableStringBuilder after = new SpannableStringBuilder();

        before.append(clickText1);
        before.setSpan(new ClickableSpan() {
            @Override
            public void onClick(@NonNull View widget) {
                ToastHelper.show(widget.getContext(), widget.toString() + " before");
            }

            @Override
            public void updateDrawState(@NonNull TextPaint ds) {
                //super.updateDrawState(ds); --> 注释掉,就没有下划线了
            }
        }, 0, before.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); // 1. click
        before.setSpan(new ForegroundColorSpan(Color.RED), 0, before.length(),
            Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); // 2. color

        after.append(clickText2);
        after.setSpan(new ClickableSpan() {
            @Override
            public void onClick(@NonNull View widget) {
                ToastHelper.show(widget.getContext(), widget.toString() + " after");
            }

            @Override
            public void updateDrawState(@NonNull TextPaint ds) {
                //super.updateDrawState(ds);
            }
        }, 0, after.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); // 1. click
        after.setSpan(new ForegroundColorSpan(Color.RED), 0, after.length(),
            Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); // 2. color

        full.append(head).append(before).append(text).append(after).append(tail);
        // ##### end
        tvAppend.setMovementMethod(LinkMovementMethod.getInstance());
        tvAppend.append(full);
    }
// 不 推荐使用这个方法
private void showSet(@NonNull View view) {
        TextView tv = view.findViewById(R.id.tv_content);

        final SpannableStringBuilder style = new SpannableStringBuilder();

        // 设置文字
        style.append("张飞的眩晕效果很好,但是比不上姜子牙...");

        style.setSpan(new ClickableSpan() {
            @Override
            public void onClick(@NonNull View widget) {
                ToastHelper.show(widget.getContext(), "111...");
            }

            @Override
            public void updateDrawState(@NonNull TextPaint ds) {
                //super.updateDrawState(ds); // super 里面会添加下划线
            }
        }, 0, 2, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); // 1. 设置 "张飞"的点击事件
        style.setSpan(new ForegroundColorSpan(Color.BLUE), 0, 2,
            Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);  // 2. 设置 "张飞"的颜色

        // 设置部分文字点击事件
        final ClickableSpan clickableSpan = new ClickableSpan() {
            @Override
            public void onClick(@NonNull View widget) {
                ToastHelper.show(widget.getContext(),"333");
            }

            @Override
            public void updateDrawState(@NonNull TextPaint ds) {
                //super.updateDrawState(ds);
            }
        };
        style.setSpan(clickableSpan, 4, 6, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
        tv.setText(style);

        // 设置部分文字颜色
        ForegroundColorSpan foregroundColorSpan =
            new ForegroundColorSpan(Color.parseColor("#FF0000"));
        style.setSpan(foregroundColorSpan, 4, 6, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

        //配置给TextView
        tv.setMovementMethod(LinkMovementMethod.getInstance());
        tv.setText(style);
    }
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值