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) } } }