Kotlin: Java Util Date to String for Databindings

36,741

Solution 1

Using the reserved word object in kotlin, that you really doing is declare a single instance. the equivalent in java is something more or less like:

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

then when you call it you do a DateUtils.INSTANCE.toSimpleString()

You should capable to use DateUtils.INSTANCE.toSimpleString() in your xml


In order to make toSimpleString accessible from static context, you have to flag the method with@JvmStatic

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

Using extension function(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)
}

Then you can use it directly in xml as you are already doing:

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

Solution 2

Why don't you just use a top-level function which is static by default? A top-level function is not defined in any class.

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

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

Also, notice how Jouney's date is nullable in your example and your toSimpleString only accepts a non-nullable Date!

I changed it, so that it will return the string of the current date in case null is passed.

Share:
36,741
Kevin
Author by

Kevin

Updated on July 09, 2022

Comments

  • Kevin
    Kevin almost 2 years

    I want to use the Date value of my Data class in view via Databinding. If I use the toString() method on the Date field it works. But I want to customize the Date value. So I created the Utils object with Method. This is the Util object

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

    But if I want to use this method in the xml like this

    <data>
        <import type="de.mjkd.journeylogger.Utils.DateUtils"/>
    
        <variable
            name="journey"
            type="de.mjkd.journeylogger.data.Journey"/>
    </data>
    ...
        android:text="@{DateUtils.toSimpleString(journey.date)}"
    

    I get an error cannot find method toSimpleString(java.util.Date) in class ...

    This is my Dataclass:

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

    Whats wrong with this code?

  • Kevin
    Kevin over 6 years
    thank you for your explanation. I have tried the Extension Function and called it in the xml like this android:text="@{journey.date.toSimpleString())but this did not work. How do i call the extension Function from the xml?
  • crgarridos
    crgarridos over 6 years
    @Kevin Xml does use the java syntax to resolve the code, you have to use it as static funtion as described in the end of my answer, read this doc for more understanding
  • Sam Chen
    Sam Chen over 3 years
    Then you have to write 10 times of the same method if you have 10 model classes (if they all have Date property).