记一次SpannableString使用

        相信很多app在登录或者注册页面会出现下面这个样式:一行文字 两个下划线 两个点击事件。偷懒的实现 可能会放三四个textview 然后给其中两个添加下划线和点击事件,但感觉不是很优雅,于是就想到了用SpannableString来实现

鳖嗦话,直接上代码

String text = "登录/注册即表示同意链会议 服务条款 和 隐私条款";

        SpannableString spanString = new SpannableString(text);

        ForegroundColorSpan foregroundColorSpan = new ForegroundColorSpan(getResources().getColor(R.color.color_a0a0a0));

        ClickableSpan serviceSpan = new ClickableSpan() {

            @Override

            public void onClick(View widget) {

            }

        };

        UnderlineSpan underlineSpan = new UnderlineSpan(){

            @Override

            public void updateDrawState(TextPaint ds) {

                ds.setColor(Color.parseColor("#a0a0a0"));

                ds.setUnderlineText(true);

            }

        };

        UnderlineSpan newUnderlineSpan = new UnderlineSpan(){

            @Override

            public void updateDrawState(TextPaint ds) {

                ds.setColor(Color.parseColor("#a0a0a0"));

                ds.setUnderlineText(true);

            }

        };

        ClickableSpan privacySpan = new ClickableSpan() {

            @Override

            public void onClick(View widget) {

            }

        };

        spanString.setSpan(foregroundColorSpan, 0, text.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

        spanString.setSpan(serviceSpan,14, 18, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

        spanString.setSpan(underlineSpan,14, 18, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

        spanString.setSpan(privacySpan,21, 25, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

        spanString.setSpan(newUnderlineSpan,21, 25, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

        tvProtocol.setText(spanString);

        tvProtocol.setMovementMethod(LinkMovementMethod.getInstance());

因为有好多博主已经详细解说过Spanned的flag 我在这就不废话了(其实也是自己没有去研究)

传送门:其实你不懂:Android之Spanned flag

这里主要记录一下我在使用中遇到的问题:

眼尖的小伙伴可能发现 我为啥写了两个一样的添加下划线的UnderlineSpan,用一个不是还节省对象的创建吗?!

最开始 我也是这么想的,但结果发现如果两个共用一个UnderlineSpan对象的话,UnderlineSpan设置的颜色就会失效。

有人问“为啥你的下划线还要设置颜色?” 

其实,单独设置下划线的话,是不需要重写UnderlineSpan的updateDrawState()方法。

但由于我的需求里面 有下划线的那几个字是有额外的点击事件的,要想同时拥有点击和下划线,只能这么写(也可能是我还没有找到更好的)。

你可能感兴趣的:(记一次SpannableString使用)