2017-12-18 215 views
0

我想通過Databinding在視圖中使用Data類中的Date值。 如果我使用日期字段上的toString()方法,它會起作用。但我想自定義日期值。 所以我用Method創建了Utils對象。這是util對象Kotlin:數據綁定的Java Util日期字符串

object DateUtils { 

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

但是,如果我想用這種方法在這樣的XML

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

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

我得到一個錯誤cannot find method toSimpleString(java.util.Date) in class ...

這是我的數據類:

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

這段代碼有什麼問題?

+0

一個問題是確保journey.date是可以爲空並且toSimpleString只接受一個不可爲空的日期。 –

回答

1

在科特林使用保留字對象,你真的做的是聲明一個實例。 Java中的等價物的東西或多或少這樣的:

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

那麼當你叫什麼你做一個DateUtils.INSTANCE.toSimpleString()

你應該能夠在你的XML


使用DateUtils.INSTANCE.toSimpleString()爲了使toSimpleString從靜態上下文訪問,您必須標記該方法與@JvmStatic

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

使用擴展功能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) 
} 

然後你就可以直接在XML中使用它,你已經這樣做:

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

感謝您的解釋。我已經嘗試過擴展函數並在xml中調用它,像這樣的'android:text =「@ {journey.date.toSimpleString())''但是這不起作用。我怎樣從xml調用擴展函數? – Kevin

+0

@ Kevin Xml確實使用java語法來解析代碼,您必須將其用作我答案末尾描述的靜態函數,請閱讀[本文檔](https://kotlinlang.org/docs/reference/extensions.html )瞭解更多 – crgarridos

-1

功能toSimpleString必須是靜態的,所以:

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

你爲什麼不只是使用一個頂級函數默認是靜態的?頂級函數沒有在任何類中定義。

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

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

另外,還要注意Jouney的日期是如何在你的例子可空和你toSimpleString只接受一個非空的日期!

我改變了它,這樣它會在返回null的情況下返回當前日期的字符串。