Kotlin DataBinding 将静态函数传递到布局中 xml

Kotlin DataBinding pass static function into layout xml

在 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")}'

但我在 Kotlin 中尝试过 companion 但没有成功。它说

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

这是我在 kotlin 中尝试的方法

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

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

您是否尝试过添加 @JvmStatic 注释?应该有帮助!

来自官方source

Specifies that an additional static method needs to be generated from this element if it's a function. If this element is a property, additional static getter/setter methods should be generated.

实用程序通常创建为 Kotlin 文件。因为 Kotlin 文件方法是全局的。您可以在任何地方使用它而无需制作 @JvmStatic

BindingAdapterDefault.kt

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

同样适用于您, class,方括号,同伴,对象等...

来自XML

<import type="com.innovanathinklabs.sample.ui2.BindingAdapterDefaultKt"/>

android:text="@{BindingAdapterDefaultKt.formatUnixTime(1540966388,`hh:mm:ss`)}"

这就是你所需要的。

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

来自 Java class

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

来自 Kotlin class

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`}"
    />

BindingAdapterDefault.kt

@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))
}

如果不想用@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 单例 class 然后:

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