Search code examples
androidkotlinandroid-databinding

Kotlin: Java Util Date to String for Databindings


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?


Solution

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