Kotlin: Java Util Date to String for Databindings
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.
Kevin
Updated on July 09, 2022Comments
-
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 over 6 yearsthank 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 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 over 3 yearsThen you have to write 10 times of the same method if you have 10 model classes (if they all have
Date
property).