我有一个格式化某些文本的功能
fun String.formatTo(): String {
if (this.isNotEmpty()) {
val value = this.toDouble()
return "%.02f".format(value)
}
return ""
}
我想通过数据绑定将此乐趣应用到我的textView中,所以我调用了textView android:text="@{viewModel.text.formatTo()}"
,将布局中的类data
导入了
<data>
<import type="com.project.utils.extensions.ExtKt"/>
<variable
name="viewModel"
type="com.project.ViewModel" />
</data>
但是我在构建时出错:
Found data binding errors.
****/ data binding error ****msg:cannot find method formatTo() in class java.lang.String
出什么问题了?
答案 0 :(得分:1)
尝试以下
像下面一样使用@JvmStatic
@JvmStatic
fun String.formatTo(): String {
if (this.isNotEmpty()) {
val value = this.toDouble()
return "%.02f".format(value)
}
return ""
}
更新
android:text="@{ExtKt.formatTo()}"
答案 1 :(得分:0)
数据绑定仍然是Java模块,因此无法在其中使用kotlin的某些功能(例如扩展功能)。您在这里只能做的事情-在ViewModel
类中创建特定的函数。
class ViewModel {
val text: String
...
fun getDisplayText(): String = text.formatTo()
}
也许您想使用计算出的属性。
val displayText: String get() = text.formatTo()
无论如何,您的xml调用将如下所示:
android:text="@{viewModel.displayText}"
答案 2 :(得分:0)
考虑使用MediatorLiveData:
class ViewModel(
val list: MutableLiveData<List<String>> = MutableLiveData<List<String>>()
) {
val listStr = MediatorLiveData<String>()
init {
listStr .addSource(list, Observer {
listStr .postValue(ViewModel.joinList(it))
})
}
companion object {
@JvmStatic fun joinList(list: List<String>): String {
return list.joinToString(separator = ", ")
}
}
}
并且比xml中的
<TextView
android:id="@+id/items"
android:text="@{viewModel.listStr}"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>