美文网首页
Android 通过 SpannableStringBuilde

Android 通过 SpannableStringBuilde

作者: ChenME | 来源:发表于2020-05-07 10:58 被阅读0次

Android 通过 SpannableStringBuilder 实现登录页各种超链接的效果

  1. 原始字符串;
<string name="user_protocol">新用户登录即完成注册,代表同意《用户协议》、《隐私协议》以及《法律声明》。</string>
  1. 要求只有三个协议染色,并可点击跳转到指定页面;
  2. 具体代码实现;
val spannableStringBuilder = SpannableStringBuilder()
spannableStringBuilder.append(string(R.string.user_protocol))

// 用户协议
val userProtocolClickSpan = object : ClickableSpan() {
    override fun onClick(widget: View) {
        // 跳转指定页
    }
    override fun updateDrawState(ds: TextPaint) {
        ds.isUnderlineText = false // 去除下划线
    }
}
val startUserProtocol = spannableStringBuilder.indexOf("《隐私协议》")
val endUserProtocol = startUserProtocol + "《用户协议》".length
spannableStringBuilder.setSpan(userProtocolClickSpan, startUserProtocol, endUserProtocol, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)
spannableStringBuilder.setSpan(ForegroundColorSpan(color(R.color.color_blue_theme)), startUserProtocol, endUserProtocol, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE) // 设置协议字体颜色

// 隐私协议
val privacyProtocolClickSpan = object : ClickableSpan() {
    override fun onClick(widget: View) {
        // 跳转指定页
    }
    override fun updateDrawState(ds: TextPaint) {
        ds.isUnderlineText = false // 去除下划线
        ds.color = color(R.color.color_blue_theme) // 设置字体颜色
    }
}
val startPrivacyProtocol = spannableStringBuilder.indexOf("《隐私协议》")
val endPrivacyProtocol = startPrivacyProtocol + "《隐私协议》".length
spannableStringBuilder.setSpan(privacyProtocolClickSpan, startPrivacyProtocol, endPrivacyProtocol, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)

// 法律声明
val legalStatementClickSpan = object : ClickableSpan() {
    override fun onClick(widget: View) {
        // 跳转指定页
    }
    override fun updateDrawState(ds: TextPaint) {
        ds.isUnderlineText = false // 去除下划线
        ds.color = color(R.color.color_blue_theme) // 设置字体颜色
    }
}
val startLegalStatement = spannableStringBuilder.indexOf("《法律声明》")
val endLegalStatement = startLegalStatement + "《法律声明》".length
spannableStringBuilder.setSpan(legalStatementClickSpan, startLegalStatement, endLegalStatement, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)

tv_protocol.movementMethod = LinkMovementMethod.getInstance()
tv_protocol.text = spannableStringBuilder

注意:

  • #16#25/#39 的效果一样;
  • #16 可以更换大段内容的颜色,不需要逐个去设置;
  • #16 方式下,ForegroundColorSpan(color(R.color.color_blue_theme) 需要每次都创建一个新的对象,不可多处使用同一个对象,否则前面设置不会生效,只有最后一次设置的才有效果;

相关文章

网友评论

      本文标题:Android 通过 SpannableStringBuilde

      本文链接:https://www.haomeiwen.com/subject/jdpoghtx.html