给TextView中指定的字符添加点击事件

一 、需求分析

如下图:登陆界面有一个文字说明,其中 Service Terms 和 Privacy Policy 两个词需要高亮显示,且要求点击之后进入相应的页面。
这里写图片描述

首先我想到的是对Service Terms 和 Privacy Policy 使用不同的TextView,但是这样布局非常麻烦,且需要使用多个TextView,而且对于不同分辨率的手机可能无法完美适配。那么,如果使用一个TextView能不能实现需求呢,我已经知道TextView可以支持改变指定字符的颜色,那么能不能支持给指定字符添加点击事件呢? 在网上查了一下,还真能。

二、 关键代码

那么就简单粗暴地直接上代码好了。

    private void setServicePolicy(){
        String itemStr = tvLoginPolicy.getText().toString();
        String serviceStr = "Service Terms";
        String policyStr = "Privacy Policy";
        int indexService = itemStr.indexOf(serviceStr);
        int indexPolicy = itemStr.indexOf(policyStr);
        SpannableString spannableString = new SpannableString(itemStr);
        //Service Terms 颜色和点击事件
        spannableString.setSpan(new ClickableSpan() {
            @Override
            public void onClick(View view) {
                LogDebugUtil.e(TAG, "clicked Service Terms");
            }

            @Override
            public void updateDrawState(TextPaint ds) {
                ds.setColor(Color.BLACK);
                ds.setUnderlineText(true);
            }
        }, indexService, indexService + serviceStr.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

        //Privacy Policy 颜色和点击事件
        spannableString.setSpan(new ClickableSpan() {
            @Override
            public void onClick(View view) {
                LogDebugUtil.e(TAG, "clicked Privacy Policy");
            }

            @Override
            public void updateDrawState(TextPaint ds) {
                ds.setColor(Color.BLACK);
                ds.setUnderlineText(true);
            }
        }, indexPolicy, indexPolicy + policyStr.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        tvLoginPolicy.setText(spannableString);
        tvLoginPolicy.setMovementMethod(LinkMovementMethod.getInstance());

    }
  1. 这段代码字符串直接写在了代码里,但不建议这样写,指定字符串最好放在资源文件里再通过代码获取,这里只是为了展示。
  2. 在 updateDrawState 方法里可以设置字符的颜色,以及是否需要下划线。对于可点击字符,最好加上下划线,不然用户可能不知道哪里可以点击。
  3. 最后一句代码 tvLoginPolicy.setMovementMethod(LinkMovementMethod.getInstance()) 必须添加,不然字符无法响应点击事件。
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值