Kotlin:Java Util Date to String for Databindings

Kev*_*vin 2 android kotlin android-databinding

我想通过数据绑定在视图中使用我的Data类的Date值.如果我在Date字段上使用toString()方法,它可以工作.但我想自定义Date值.所以我用Method创建了Utils对象.这是Util对象

object DateUtils {

     fun toSimpleString(date: Date) : String {
        val format = SimpleDateFormat("dd/MM/yyy")
        return format.format(date)
    }
}
Run Code Online (Sandbox Code Playgroud)

但是如果我想在xml中使用这个方法就像这样

<data>
    <import type="de.mjkd.journeylogger.Utils.DateUtils"/>

    <variable
        name="journey"
        type="de.mjkd.journeylogger.data.Journey"/>
</data>
...
    android:text="@{DateUtils.toSimpleString(journey.date)}"
Run Code Online (Sandbox Code Playgroud)

我收到一个错误 cannot find method toSimpleString(java.util.Date) in class ...

这是我的Dataclass:

data class Journey(var title: String, var date: Date?, var destination: String)
Run Code Online (Sandbox Code Playgroud)

这段代码有什么问题?

crg*_*dos 15

使用kotlin中的保留字对象,您真正要做的是声明一个实例.java中的等价物或多或少是这样的:

class DataUtils {
    static DataUtils INSTANCE;
    public String toSimpleString()...
}
Run Code Online (Sandbox Code Playgroud)

然后,当你打电话给你时,你做了一个 DateUtils.INSTANCE.toSimpleString()

你应该能够DateUtils.INSTANCE.toSimpleString()在你的xml中使用


为了toSimpleString从静态上下文访问,您必须使用标记方法@JvmStatic

object DateUtils {
    @JvmStatic
    fun toSimpleString(date: Date) : String {
        val format = SimpleDateFormat("dd/MM/yyy")
        return format.format(date)
    }
}
Run Code Online (Sandbox Code Playgroud)

使用扩展功能(doc)

@file:JvmName("DateUtils")//Use this to change your class name in java, by default is <the file name>Kt (DateUtilsKt in your case)

fun Date.toSimpleString() : String {
    val format = SimpleDateFormat("dd/MM/yyy")
    return format.format(this)
}
Run Code Online (Sandbox Code Playgroud)

然后你可以直接在xml中使用它,就像你已经在做的那样:

android:text="@{DateUtils.toSimpleString(journey.date)}"
Run Code Online (Sandbox Code Playgroud)