TextView实现可点击、下划线、不同颜色显示

首先,定义一个可点击的文本类,包含文本内容和点击监听:

public class ClickText {
    private String text;

    public interface OnClickListener {
        void onClick();
    }

    private OnClickListener onClickListener;

    public ClickText(String text) {
        this.text = text;
    }

    public ClickText(String text, OnClickListener onClickListener) {
        this.text = text;
        this.onClickListener = onClickListener;
    }

    public String getText() {
        return text;
    }

    public void setText(String text) {
        this.text = text;
    }

    public OnClickListener getOnClickListener() {
        return onClickListener;
    }

    public void setOnClickListener(OnClickListener onClickListener) {
        this.onClickListener = onClickListener;
    }
    
}

其次,对各需要点击的文本进行处理:

public class MultiText {
    
    public static class Builder {
        int defaultColor = Color.BLACK;
        int specialColor = Color.BLUE;
        boolean showUnderLine = false;
        String totalText = "";
        List<ClickText> clickTextList = new ArrayList<>(4);

        /**
         * 设置默认颜色
         */
        public Builder setDefaultColor(@ColorInt int color) {
            defaultColor = color;
            return this;
        }

        /**
         * 设置指定颜色
         */
        public Builder setSpecialColor(@ColorInt int color) {
            specialColor = color;
            return this;
        }

        /**
         * 设置下划线
         */
        public Builder setShowUnderLine(boolean isShowUnderLine) {
            showUnderLine = isShowUnderLine;
            return this;
        }

        /**
         * 设置全部文本
         */
        public Builder setTotalText(String text) {
            totalText = text;
            return this;
        }

        /**
         * 设置点击文本
         */
        public Builder addClickText(ClickText... clickTexts) {
            for (ClickText clickText : clickTexts) {
                if (clickText != null) {
                    clickTextList.add(clickText);
                }
            }
            return this;
        }

        public void apply(TextView textView) {
            if (TextUtils.isEmpty(totalText) || clickTextList.size() == 0) {
                return;
            }
            totalText = totalText.trim();
            SpannableString spannableString = new SpannableString(totalText);
            int position;
            int index = 0;
            for (int i = 0; i < clickTextList.size(); i++) {
                ClickText clickText = clickTextList.get(i);
                position = totalText.indexOf(clickText.getText(), index);
                // 找不到
                if (position == -1) {
                    continue;
                }
                int length = clickText.getText().length();
                if (position != index) {
                    spannableString.setSpan(new ForegroundColorSpan(defaultColor), index, position, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
                }
                spannableString.setSpan(new ForegroundColorSpan(specialColor), position, position + length, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

                final ClickText.OnClickListener onClickListener = clickText.getOnClickListener();
                spannableString.setSpan(new ClickableSpan() {
                    @Override
                    public void onClick(View widget) {
                        if (onClickListener != null) {
                            onClickListener.onClick();
                        }
                    }

                    @Override
                    public void updateDrawState(TextPaint ds) {
                        ds.setUnderlineText(false);
                    }
                }, position, position + length, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

                if (showUnderLine) {
                    spannableString.setSpan(new UnderlineSpan(), position, position + length, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
                }
                index = position + length;
            }
            if (index < totalText.length()) {
                spannableString.setSpan(new ForegroundColorSpan(defaultColor), index, totalText.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
            }

            textView.setMovementMethod(LinkMovementMethod.getInstance());
            textView.setHighlightColor(Color.TRANSPARENT);
            textView.setText(spannableString);
        }
    }

    public static Builder newBuilder() {
        return new Builder();
    }
    
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • //我所经历的大数据平台发展史(三):互联网时代 • 上篇http://www.infoq.com/cn/arti...
    葡萄喃喃呓语阅读 51,367评论 10 200
  • 我假装听得懂诗歌一般,也拥有远方和理想。 粗啃过几本文学小说,假装博览过群书一样;偶尔欣赏民谣,假装也有浪荡的灵魂...
    许LZ阅读 374评论 6 2
  • 我的初恋,是在高中时。当时我算是班里的学霸之一了,暗恋的女孩也是班里少有的漂亮还勤奋的女生。她的名字很特别,我叫她...
    玉珠阳光阅读 356评论 0 0
  • 今天有好友推送了一篇文章给我,这些看似严格的“时间管理”可能让你工作效率急剧下滑(来源有道原创,原文为中英文双语,...
    粉蓝阅读 1,339评论 4 12
  • 题记【倚窗静看时光旖旎着一曲花开花落,红尘驿站,总会有人来人往,曾经的美好,未曾辜负,繁华散尽,风轻云淡。有阴...
    云无际阅读 282评论 0 0