【问题标题】:Kotlin: Java Util Date to String for DatabindingsKotlin:用于数据绑定的 Java Util 日期到字符串
【发布时间】:2018-05-31 19:23:55
【问题描述】:

我想通过数据绑定在视图中使用我的 Data 类的 Date 值。 如果我在 Date 字段上使用 toString() 方法,它就可以工作。但我想自定义日期值。 所以我用 Method 创建了 Utils 对象。这是 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)

这段代码有什么问题?

【问题讨论】:

  • 一个问题是确定 Journey.date 可以为空,而 toSimpleString 只接受不可为空的日期。

标签: android kotlin android-databinding


【解决方案1】:

使用 kotlin 中的保留字 object,您真正要做的就是声明一个实例。 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)}"

【讨论】:

  • 感谢您的解释。我已经尝试过扩展函数并像这样在 xml 中调用它android:text="@{journey.date.toSimpleString())但这不起作用。如何从 xml 调用扩展函数?
  • @Kevin Xml 确实使用 java 语法来解析代码,您必须将其用作静态函数,如我的答案末尾所述,阅读this doc 以获得更多理解
【解决方案2】:

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

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

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

另外,请注意 Jouney 的日期在您的示例中如何可以为空,而您的 toSimpleString 只接受不可为空的日期!

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

【讨论】:

    【解决方案3】:

    更简单的方法是在模型类中创建一个getDateString

    android:text="@{journey.dateString)}"
    
    class Journey {
        lateinit var date: Date
        fun getDateString(){
            return DataUtils.toSimpleString(date)
        }
    }
    

    我喜欢这种方式,因为在这种情况下我不需要导入任何类。

    【讨论】:

    • 那么如果你有 10 个模型类(如果它们都有 Date 属性),你必须编写 10 次相同的方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-30
    相关资源
    最近更新 更多