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

Adm*_*kka 4 android kotlin android-databinding

在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;
}
Run Code Online (Sandbox Code Playgroud)

在xml中:

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

但是我在科特林尝试过companion但没有运气。它说

error: cannot find symbol
import my.package.name.HistoryItemBindingImpl;
                      ^
  symbol:   class HistoryItemBindingImpl
  location: package my.package.name
Run Code Online (Sandbox Code Playgroud)

这就是我在科特林尝试过的

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
        }
    }
Run Code Online (Sandbox Code Playgroud)

并在xml中

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

真希望有人能帮忙。谢谢!

使用@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
        }
Run Code Online (Sandbox Code Playgroud)

你可以在xml中使用它

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

Mak*_* V. 9

您是否尝试添加@JvmStatic注释?这可能会有所帮助此外,另一种可能的解决方案是使用object代替class

这些对你有用吗?


Khe*_*raj 7

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

BindingAdapterDefault.kt

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

这对你同样有用,没有类、括号、伴侣、对象等......

来自 XML

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

android:text="@{BindingAdapterDefaultKt.formatUnixTime(1540966388,`hh:mm:ss`)}"
Run Code Online (Sandbox Code Playgroud)

这就是你所需要的。

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

从 Java 类

import static com.package.BindingAdapterDefaultKt.formatUnixTime;
formatUnixTime(454545, "hh:mm:ss");
Run Code Online (Sandbox Code Playgroud)

来自 Kotlin 类

import com.package.formatUnixTime
formatUnixTime(454545, "hh:mm:ss");
Run Code Online (Sandbox Code Playgroud)

建议

我更喜欢创建与数据绑定一起引入的BindingAdapter,它非常强大。它让我在整个应用程序中具有更大的灵活性。

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    app:formatSeconds="@{1540966388}"
    app:pattern="@{`hh:mm:ss`}"
    />
Run Code Online (Sandbox Code Playgroud)

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))
}
Run Code Online (Sandbox Code Playgroud)