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