web-dev-qa-db-fra.com

Kotlin: Java Util Date to String for Databindings

Je souhaite utiliser la valeur Date de ma classe Data en vue via Databinding. Si j'utilise la méthode toString () sur le champ Date, cela fonctionne. Mais je veux personnaliser la valeur Date. J'ai donc créé l'objet Utils avec Method. Ceci est l'objet Util

object DateUtils {

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

Mais si je veux utiliser cette méthode dans le xml comme ceci

<data>
    <import type="de.mjkd.journeylogger.Utils.DateUtils"/>

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

J'obtiens une erreur cannot find method toSimpleString(Java.util.Date) in class ...

Voici ma Dataclass:

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

Quel est le problème avec ce code?

3
Kevin

En utilisant l'objet Word réservé dans kotlin, ce que vous faites vraiment, c'est déclarer une seule instance. l'équivalent dans Java est quelque chose de plus ou moins comme:

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

puis quand vous l'appelez, vous faites une DateUtils.INSTANCE.toSimpleString()

Vous devriez être capable d'utiliser DateUtils.INSTANCE.toSimpleString() dans votre xml


Afin de rendre toSimpleString accessible à partir d'un contexte statique, vous devez marquer la méthode avec @JvmStatic

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

Utilisation de la fonction d'extension ( 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)
}

Ensuite, vous pouvez l'utiliser directement en xml comme vous le faites déjà:

Android:text="@{DateUtils.toSimpleString(journey.date)}"
12
crgarridos

Pourquoi n'utilisez-vous pas simplement une fonction de niveau supérieur qui est statique par défaut? Une fonction de niveau supérieur n'est définie dans aucune classe.

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

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

Notez également que la date de Jouney est nullable dans votre exemple et que votre toSimpleString accepte uniquement une date non nullable!

Je l'ai changé, afin qu'il renvoie la chaîne de la date actuelle au cas où null serait passé.

0
Willi Mentzel

Plus simple serait de faire un getDateString dans la classe modèle.

Android:text="@{journey.dateString)}"

class Journey {
    lateinit var date: Date
    fun getDateString(){
        return DataUtils.toSimpleString(date)
    }
}

J'aime cette façon parce que je n'ai pas besoin d'importer de classe dans ce cas.

0
Khemraj