android - 我们如何使用数据绑定(bind)从字符串资源中获取 SpannedString 对象?

标签 android android-resources android-databinding

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构建错误。

如果我使用 StringCharSequence对于 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/

相关文章:

安卓数据绑定(bind) : conditional formatting to set layout_weight

安卓数据绑定(bind) : Pass variable to NavigationView

android - 我是否需要使用所有 drawable、drawable-mdpi、drawable-hdpi、drawable-xhdpi、drawable-xxhdpi 和 drawable-xxxhdpi?

android - View.post 没有加快图像处理速度?

java - Android Studio 禁用点击声音

android - 如何在 Kotlin 中绘制可绘制对象?

android - 我是否应该将用作 Android Bundle 内键的字符串作为资源存储?

java - 无法在 android 中执行 HTTPS/SSL/

android - 以编程方式更改从 API 响应获得的颜色资源的值

android - 不工作 : Android Studio 3. 2 Canary11 + 3.2.0-alpha11 for kapt with com.android.databinding