Florina Muntenescu 写了 a cool post关于使用<annotation>
在字符串资源中,以便能够拥有灵活的标记,您可以使用自定义跨度在您的应用程序中处理这些标记。我试图在数据绑定(bind)中利用它,但我不太清楚如何获得 SpannedString
来自数据绑定(bind)的字符串资源的版本。
在我的布局中,我有 app:thingy="@{@string/my_annotated_string}"
作为 TextView
的属性.我设置了绑定(bind)适配器来处理 thingy
属性。但是,数据绑定(bind)系统似乎坚持认为我的值为 String
。 .
我试过:
@BindingAdapter("thingy")
@JvmStatic
fun handleThingy(textView: TextView, thingy: SpannedString) { /* stuff goes here */ }
和:
@BindingAdapter("thingy")
@JvmStatic
fun handleThingy(textView: TextView, thingy: Spanned) { /* stuff goes here */ }
和:
@BindingAdapter("thingy")
@JvmStatic
fun handleThingy(textView: TextView, @StringRes thingy: Int) { /* stuff goes here */ }
在所有情况下,我都会得到 Cannot find the setter for attribute 'app:thingy' with parameter type java.lang.String on android.widget.TextView
构建错误。
如果我使用 String
或 CharSequence
对于 thingy
参数类型,它构建,但后来我得到了一个 String
而且我没有来自字符串资源的注释跨度。
那么,我怎样才能:
- 获取
SpannedString
对应于我的字符串资源(即你从getText()
而不是getString()
得到的),或者 - 获取我的字符串资源的字符串资源 ID,这样我就可以调用
getText()
我自己得到我的SpannedString
最佳答案
作为表达式,@string/my_annotated_string
计算为字符串。尽管它类似于 XML 中的字符串资源引用,但它实际上只是一个 String
值。
最好也有一个 @text/my_annotated_string
版本,但是在文档中这是不可用的。
相反,您必须在绑定(bind)表达式中使用实际资源:
app:thingy="@{string.my_annotated_string}"
app:thingy="@{context.getText(string.my_annotated_string)}"
假设导入了 string
类:
<import type="path.to.R.string"/>
关于android - 我们如何使用数据绑定(bind)从字符串资源中获取 SpannedString 对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53106939/