TextView 实现部分文字改变多种颜色并为单段或多段不同颜色的文字段添加不同点击事件

今天晨诺星空继续给大家分享干货知识,福利来了,哈哈。如果你喜欢可以点个关注哦,男同胞关注了就是好哥们儿,哈哈,兄弟,有啥问题找我探讨,保你解决,没有什么是一杯酒解决不了的,如果又就两杯,哈哈,女同胞的话,除了带给你点编程的营养与干货,别的估计也只剩以身相许了,哈哈又调皮了

不开玩笑了,下面开始进入正题:
最近项目中遇到了一个新的需求,在谷歌订阅页面增加文字显示介绍以及点击跳转查看用户隐私协议和服务条款的视图,刚开始以为挺简单的,没有太放在心上,但当开始写布局文件时一细看UI标注图才感觉事情没有想象的那么简单,请看图:
TextView 实现部分文字改变多种颜色并为单段或多段不同颜色的文字段添加不同点击事件_第1张图片
需求说明:
1.颜色方面:Terms of Service 为红色,Privacy Policy也为红色,并且中间的连接单词and要用普通的文字颜色,剩下的文字颜色都为普通文字颜色。
2.点击事件方面:点击红色字体Terms of Service 和点击红色字体Privacy Policy要跳转的页面不一样,也就是各自添加不同的点击事件。而点击其余的字体部分则是什么都不做的。
思路分析:
原本准备用多个textview控件来实现,但一看这个位置和字数根本做不到,因为字数不确定,不同的屏幕适配的时候还会变动,所以只能用一个Textview来实现,但一个Textview能实现吗?原本以为不可能,但谷歌搜解决方案后竟然惊奇的发现这个谷歌还真是有封装在sdk里面。
然后我就一步步尝试并最终实现了想要的效果。

下面对我操作的步骤进行笔记记录:
先看下布局文件,很简单,一个原生的Textview就行:

 

下面写下关键实现代码(注意我这里贴的是kotlin代码):


        //SpannableStringBuilder类支持textview改变部分字体颜色和单独设置点击事件,需要的参数只有一个,就是需要显示的文字内容就行,我这里直接从控件获取文本内容了
        var spanable = SpannableStringBuilder(tv_sub_service_policy.text)
       
        //这个一定要记得设置,不然部分字体时点击不生效
        tv_sub_service_policy.setMovementMethod(LinkMovementMethod.getInstance())

	   //setSpan()方法参数解释:第一个参数是点击的操作监听,第二个第三个是点击事件的开始和结束下标,最后一个解释起来比较麻烦,但这里又没有用到,所以如果感兴趣可以自己搜索学习一下
        
        //第一段红色字体的点击事件
        spanable.setSpan( object :ClickableSpan(){
            override fun onClick(widget: View?) {
                startActivity(Intent(this@SubscriptionActivity, UserPolicyActivity().javaClass))
            }
        },tv_sub_service_policy.text.length-60,tv_sub_service_policy.text.length-43 , Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)

		//第二段红色字体的点击事件
        spanable.setSpan( object :ClickableSpan(){
            override fun onClick(widget: View?) {
                startActivity(Intent(this@SubscriptionActivity, MainActivity().javaClass))
            }},tv_sub_service_policy.text.length-39,tv_sub_service_policy.text.length-24 , Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)

        //这里设置指定字段的颜色,需要指定颜色和起始位置,以及Spannable参数常量类型
        //指定第一段字体颜色
        spanable.setSpan( ForegroundColorSpan(resources.getColor(R.color.red_policy)),tv_sub_service_policy.text.length-60,tv_sub_service_policy.text.length-43, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
       //指定第二段字体颜色

        //最后设置给textview控件
        tv_sub_service_policy.setText(spanable)
        
        //想去掉点击后文字背景,设置一下HighlightColor即可
        tv_sub_service_policy.setHighlightColor(Color.parseColor("#00ffffff"))


好了,到此就已经实现想要的效果和点击功能了,不得不说对textview这个控件又有了新的认知与操作经验。以上是本人个人的一些总结,如果有总结的不到之处,还望能留言指正,一定感激不尽会!

你可能感兴趣的:(android)