代码之家  ›  专栏  ›  技术社区  ›  Harry T.

Kotlin数据绑定将静态函数传递到布局xml中

  •  3
  • Harry T.  · 技术社区  · 8 年前

    在Java中,我可以使用以下方法轻松地将静态函数传递给布局xml:

    public static String formatUnixTime(long timeInSeconds, String pattern) {
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat(pattern, Locale.US);
        String value = simpleDateFormat.format(new Date(timeInSeconds * 1000));
    
        return value;
    }
    

    在xml中:

    android:text='@{Utils.formatUnixTime(model.start_time, "hh:mm:ss")}'
    

    但我在科特林试过 companion 但运气不好。上面说

    error: cannot find symbol
    import my.package.name.HistoryItemBindingImpl;
                          ^
      symbol:   class HistoryItemBindingImpl
      location: package my.package.name
    

    这就是我在科特林试过的

    class Utils {
        companion object {
            fun formatUnixTime(timeInSeconds : Long, pattern: String) : String {
                val simpleDateFormat = SimpleDateFormat(pattern, Locale.US)
                val value = simpleDateFormat.format(Date(timeInSeconds * 1000))
    
                return value
            }
        }
    

    和xml格式

    android:text='@{Utils.Companion.formatUnixTime(model.start_time, "hh:mm:ss")}'
    

    在@Max Aves的帮助下。我修复了我的代码和下面的代码将工作。也许它会帮助别人。

    class Utils {
        companion object {
            @JvmStatic
            fun formatUnixTime(timeInSeconds : Long, pattern: String) : String {
                val simpleDateFormat = SimpleDateFormat(pattern, Locale.US)
                val value = simpleDateFormat.format(Date(timeInSeconds * 1000))
    
                return value
            }
    

    您可以在xml中使用它

    2 回复  |  直到 8 年前
        1
  •  21
  •   Maksym V.    6 年前

    你试过添加 @JvmStatic

    source :

    如果它是一个函数的话。如果这个元素是一个属性, 应生成其他静态getter/setter方法。

        2
  •  7
  •   Khemraj Sharma    8 年前

    实用程序通常创建为Kotlin文件。因为Kotlin文件方法是全局的。你可以在任何地方使用 @JvmStatic

    绑定适配器默认值.kt

    fun formatUnixTime(timeInSeconds: Long, pattern: String): String {
        val simpleDateFormat = SimpleDateFormat(pattern, Locale.US)
        return simpleDateFormat.format(Date(timeInSeconds * 1000))
    }
    

    不 类、括号、同伴、对象等。。。

    从XML

    <import type="com.innovanathinklabs.sample.ui2.BindingAdapterDefaultKt"/>
    
    android:text="@{BindingAdapterDefaultKt.formatUnixTime(1540966388,`hh:mm:ss`)}"
    

    这就是你所需要的。

    我想添加更多关于这个的信息。您也可以直接从Java和Kotlin调用这个方法。

    来自Java类

    import static com.package.BindingAdapterDefaultKt.formatUnixTime;
    formatUnixTime(454545, "hh:mm:ss");
    

    从科特林班

    import com.package.formatUnixTime
    formatUnixTime(454545, "hh:mm:ss");
    

    我更喜欢创造 BindingAdapter

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:formatSeconds="@{1540966388}"
        app:pattern="@{`hh:mm:ss`}"
        />
    

    @BindingAdapter(value = ["formatSeconds", "pattern"])
    fun secondsToDateText(textView: TextView, timeInSeconds: Long, pattern: String) {
        val simpleDateFormat = SimpleDateFormat(pattern, Locale.US)
        textView.text = simpleDateFormat.format(Date(timeInSeconds * 1000))
    }
    
        3
  •  1
  •   Nongthonbam Tonthoi    6 年前

    如果你不想用 @JvmStatic ,您可以使用 object 而不是 class :

    object Utils {
    
        fun formatUnixTime(timeInSeconds : Long, pattern: String) : String {
            val simpleDateFormat = SimpleDateFormat(pattern, Locale.US)
            val value = simpleDateFormat.format(Date(timeInSeconds * 1000))
            return value
        }
    }
    

    xml 导入 Utils

    android:text='@{Utils.INSTANCE.formatUnixTime(model.start_time, "hh:mm:ss")}'