数据绑定无法使用String.function()调用静态函数

时间:2019-02-26 08:56:14

标签: android kotlin android-databinding

我有一个格式化某些文本的功能

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

出什么问题了?

3 个答案:

答案 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"/>