Kotlin:Java利用日期到数据绑定的字符串

我想通过Databinding在视图中使用我的Data类的Date值。 如果我使用日期字段上的toString()方法,它将起作用。 但是我想自定义日期值。 所以我用Method创建了Utils对象。 这是Util对象

object DateUtils { fun toSimpleString(date: Date) : String { val format = SimpleDateFormat("dd/MM/yyy") return format.format(date) } } 

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

     ... android:text="@{DateUtils.toSimpleString(journey.date)}" 

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

这是我的Dataclass:

 data class Journey(var title: String, var date: Date?, var destination: String) 

这个代码有什么问题?

使用kotlin中的保留字对象 ,你真的在​​做的是声明一个实例。 在Java中的等价物是或多或少的东西:

 class DataUtils { static DataUtils INSTANCE; public String toSimpleString()... } 

那么当你调用它你做一个DateUtils.INSTANCE.toSimpleString()

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


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

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

使用扩展function ( doc )

 @file:JvmName("DateUtils")//Use this to change your class name in java, by default is Kt (DateUtilsKt in your case) fun Date.toSimpleString() : String { val format = SimpleDateFormat("dd/MM/yyy") return format.format(this) } 

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

 android:text="@{DateUtils.toSimpleString(journey.date)}" 

你为什么不使用一个默认为静态的顶层函数呢? 顶级函数没有在任何类中定义。

 fun main(args: Array){ println(toSimpleString(Date())) } fun toSimpleString(date: Date?) = with(date ?: Date()) { SimpleDateFormat("dd/MM/yyy").format(this) } 

另外,注意在你的例子中Jouney的日期是可以空的,你的toSimpleString只接受一个不可空的Date!

我改变了它,以便在传递null时返回当前日期的字符串。

函数toSimpleString必须是静态的,所以:

 object DateUtils { companion object { fun toSimpleString(date: Date) : String { val format = SimpleDateFormat("dd/MM/yyy") return format.format(date) } } }