Android 设置TextView 的TextSpan样式 及点击事件。

/**
 * 配置Span标签
 */
fun TextView.setSpanText(
    string: Int, //字符串内容
    strList: Array<String>, //需要变色的字符串数组
    line: Boolean = false,//是否添加下划线
    colorSet: Int= R.color.main_color,//需要设置的颜色值
    action: (index: Int) -> Unit = {}, //点击回调
) {
    if (strList.isEmpty()) return
    val text = getStringExt(string)
    val spannableString = SpannableString(text)
    var updateIndex = 0
    var lastLength = 0 //拿最后一条起始的位置
    strList.forEachIndexed { index, spanStr ->
        var agreementStart = text.indexOf(spanStr)
        if(agreementStart ==-1){
           agreementStart  = 0
        }
        val agreementEnd = agreementStart + spanStr.length
        //点击用户协议
        spannableString.setSpan(
            object : ClickableSpan() {
                override fun updateDrawState(ds: TextPaint) {
                    // Do nothing, effectively removing the underline
                    ds.bgColor = Color.TRANSPARENT
                }

                override fun onClick(view: View) {
                    action.invoke(agreementType(strList, spanStr))
                }
            },
            agreementStart,
            agreementEnd,
            Spanned.SPAN_EXCLUSIVE_EXCLUSIVE
        )
        //点击前面的数据
        if (agreementStart > 0 && agreementStart >= updateIndex) {
           	spannableString.setSpan(
                object : ClickableSpan() {
                  override fun updateDrawState(ds: TextPaint) {
                    // Do nothing, effectively removing the underline
                      ds.bgColor = Color.TRANSPARENT
                 }

                  override fun onClick(view: View) {
                      action.invoke(-1)
                  }
                },
               updateIndex,
               agreementStart,
               Spanned.SPAN_EXCLUSIVE_EXCLUSIVE
              )
             updateIndex = agreementStart - 1
             if (index == strList.size - 1) {
                //拿最后一条起始的位置
                lastLength = updateIndex + 1
            }
        }
         //可点击后面的数据
		 if (lastLength > 0) {
		     spannableString.setSpan(
		         object : ClickableSpan() {
		             override fun updateDrawState(ds: TextPaint) {
		                 // Do nothing, effectively removing the underli
		                 ds.bgColor = Color.TRANSPARENT
		             }
		             override fun onClick(view: View) {
		                 action.invoke(-1)
		             }
		         },
		         lastLength,
		         text.length - 1,
		         Spanned.SPAN_EXCLUSIVE_EXCLUSIVE
		     )
	     }
        //取消下划线显示
        if (!line) {
            spannableString.setSpan(
                NoUnderlineSpan(),
                agreementStart,
                agreementEnd, Spanned.SPAN_MARK_MARK
            )
        }
        //设置字体颜色
        spannableString.setSpan(
            ForegroundColorSpan(getColorExt(colorSet)),
            agreementStart,
            agreementEnd,
            Spanned.SPAN_EXCLUSIVE_EXCLUSIVE
        )
    }
    this.text = spannableString
    this.movementMethod = LinkMovementMethod.getInstance()
    //取消选中高亮颜色
    this.highlightColor = Color.TRANSPARENT
}

/**
*  如何使用
*/
mBind.mTv.setSpanText(R.string.str_content, strArray,true,R.color.main_color, {
     when (it) {
           0 -> "用户协议".toast()
           1 -> "隐私协议".toast()
            else ->"点击其他位置".toast()
            }
        })  

有问题请及时指出,看到后会修改。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值