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?
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)}"
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é.
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.