2017-12-18 184 views
0

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

object DateUtils { 

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

但是,如果我想用这种方法在这样的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)}" 

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

这是我的数据类:

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

这段代码有什么问题?

+0

一个问题是确保journey.date是可以为空并且toSimpleString只接受一个不可为空的日期。 –

回答

1

在科特林使用保留字对象,你真的做的是声明一个实例。 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) 
    } 
} 

使用扩展功能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) 
} 

然后你就可以直接在XML中使用它,你已经这样做:

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

感谢您的解释。我已经尝试过扩展函数并在xml中调用它,像这样的'android:text =“@ {journey.date.toSimpleString())''但是这不起作用。我怎样从xml调用扩展函数? – Kevin

+0

@ Kevin Xml确实使用java语法来解析代码,您必须将其用作我答案末尾描述的静态函数,请阅读[本文档](https://kotlinlang.org/docs/reference/extensions.html )了解更多 – crgarridos

-1

功能toSimpleString必须是静态的,所以:

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

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

fun main(args: Array<String>){ 
    println(toSimpleString(Date())) 
} 

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

另外,还要注意Jouney的日期是如何在你的例子可空和你toSimpleString只接受一个非空的日期!

我改变了它,这样它会在返回null的情况下返回当前日期的字符串。