我不知道我在 SO 上的问题是否有确切的解决方案,但我已经被困在这很长时间了,需要解开自己的障碍。
我有一个字符串“0000 111 222”,我需要设置一个链接。我设置它的代码是这样的。
spanManager.SpannableBuilder(text, link)
.setColorSpan(ContextCompat.getColor(containerView.context, R.color.blue))
.setFontSpan(Typeface.BOLD)
.setClickableSpan(object : ClickableSpan() {
override fun onClick(textView: View) {
onClicked.value = action
}
override fun updateDrawState(ds: TextPaint) {
super.updateDrawState(ds)
ds.isUnderlineText = false
}
})
.build()
其中链接和文本都是“0000 111 222”。
现在
setClickableSpan(对象:ClickableSpan)
定义为
fun setClickableSpan(clickableSpan: ClickableSpan): SpannableBuilder {
for (span in spans) {
spannable.setSpan(clickableSpan, span.start, span.end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)
}
return this
}
变量集跨度由SpannableBuilder(text, link)构造函数设置,如下所示
fun getSpans(fullText: String, subText: String): Set<Span> {
val spans = HashSet<Span>()
if (fullText.isEmpty() || subText.isEmpty()) {
return spans
}
val ft = fullText.toLowerCase()
val st = subText.trim().toLowerCase()
val fullSplit = ft.split(" ")
val subSplit = st.split(" ")
var startPosition = 0
for (full in fullSplit) {
for (sub in subSplit) {
val subTrim = sub.trim()
if (!full.contains(subTrim)) {
continue
}
val index = startPosition + full.indexOf(subTrim)
val span = Span.create(index, index + subTrim.length)
spans.add(span)
}
startPosition += full.length + 1
}
return spans
}
它基本上是跨空格分隔符拼接链接变量。所以函数
setClickableSpan(对象:ClickableSpan)
对于“0000 111 222”,跨度的大小为 3。setSpan 是一个函数定义的 SpannableStringInternal 库。
现在的问题是链接仅设置为“0000”而不是整个字符串。而颜色和字体跨度可以为整个字符串设置。我找不到这种行为的原因。如果有人能指出这里出了什么问题以及可能的解决方法,我将不胜感激。