Kotlin DataBinding передает статическую функцию в макет XML - PullRequest
0 голосов
/ 30 октября 2018

В 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

Это то, что я пробовал в 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")}'

Ответы [ 2 ]

0 голосов
/ 31 октября 2018

Утилиты обычно создаются как Kotlin File. Потому что методы файлов Kotlin являются глобальными. Который вы можете использовать из любого места, не делая это @JvmStatic.

BindingAdapterDefault.kt

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

Это будет работать для вас так же, NO класс, скобки, компаньон, объект и т. Д. *

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

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))
}
0 голосов
/ 30 октября 2018

Вы пробовали добавить аннотацию @JvmStatic? Может помочь Также другое возможное решение - использовать object вместо class

Любая из этих работ для вас?

...