如何以编程方式将注释标记添加到字符串

How to add Annotation tags to a String programmatically

In this video Google gave an example for formatting portions of a String based on Annotation 标签可用于在 strings.xml 内的 String 中设置 key/value 对。

这是一个例子:

strings.xml

<string name="test">Hello <annotation font="sans-serif-medium">World!</annotation></string>

Kotlin 代码:

val spannedString = getText(R.string.title) as SpannedString
val annotations = spannedString.getSpans(0, spannedString.length, Annotation::class.java)
for (annotation in annotations) {
    if (annotation.key == "font") {
        val fontName = annotation.value
        val typeFace: Typeface = ...
        spannable.setSpan(TypefaceSpan(typeFace), abstract.getSpanStart(annotation),
                abstract.getSpanEnd(annotation), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)
    }
}

这也与 ReplacementSpan in this article 一起使用,以解决 ReplacementSpans 它们无法流入下一行文本的问题。

我的问题是:

我需要 create/remove 动态注释标签,以便我可以编程方式从标有注释标签的文本部分中删除标签,或将标签添加到非注释文本。

我怎样才能做到这一点?

通常我们附加 String 跨度与 ParcelableSpan like ForegroundColorSpan, BackgroundColorSpan, UnderlineSpan, TypefaceSpan 的实现......等等

并且通过观察 Annotation also implements ParcelableSpan as well, we can use setSpan() to attach annotation to it, and add the key/value pairs to its constructor.

我的另一个观察是 setSpan() 实际上接受 Object 作为第一个参数。

所以参考引用的问题article example (GitHub Repo);以编程方式设置注释:

val span = SpannableString("value \n 1 Some Value Value 2")
span.setSpan(Annotation("", "rounded"), 0, 10, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)
span.setSpan(Annotation("", "rounded"), 15, 19, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)

textView.text = span

Annotation 的密钥在这个例子中并不重要,因为我们只需要它的 tag/value。所以将其保留为空字符串。

结果: