Есть ли возможность использовать функцию расширения с привязкой данных? XML:
<data>
<import type = "my.package.domain.country.model.City.streetName" />
<variable
name = "city"
type = "my.package.domain.country.model.City" />
</data>
<TextView
android:id = "@+id/city"
android:layout_width = "wrap_content"
android:layout_height = "wrap_content"
android:text = "@{city.street.streetName()}" />
my.package.domain.country.model.city
data class City(
val id: String,
val street: Street
)
fun City.streetName(): String = street.houseNumber
Ошибка
[kapt] An exception occurred: android.databinding.tool.util.LoggedErrorException: Found data binding errors. ****/ data binding error ****msg:cannot find method streetName() in class my.package.domain.country.model.City
Спасибо ;)





Сначала вам нужно импортировать CityKt в xml
<import type = "my.package.domain.country.model.CityKt" />
в разделе данных тогда вы можете использовать это так
<TextView
android:id = "@+id/city"
android:layout_width = "wrap_content"
android:layout_height = "wrap_content"
android:text = "@{CityKt.streetName(city)}" />
Если вы просмотрите CityKt, вы увидите, что существует статический метод Java с City в качестве первого аргумента.
Можно ли также использовать методы экземпляра с привязкой данных?
Хотя @ skiff2011 верен, можно также использовать alias для предотвращения постфикса Kt.
Например, определенная функция расширения, расположенная в ExtensionFunctionsKt, может иметь псевдоним ExtensionFunctions.
<import
alias = "ExtensionFunctions"
type = "com.helloworld.app.util.ExtensionFunctionsKt" />
<variable
name = "someData"
type = "com.helloworld.app.model.SomeData" />
Псевдоним ExtensionFunction теперь можно использовать для вызова функции расширения. Первым аргументом по-прежнему должна быть переменная расширенного класса.
<TextView
android:id = "@+id/city"
android:layout_width = "wrap_content"
android:layout_height = "wrap_content"
android:text = "@{ExtensionFunctions.doStuff(someData)}" />
Если вы используете класс Utils, вы можете:
object Utils(){
fun streetName(): String {}
}
<import
type = "com.helloworld.app.util.Utils" />
<TextView
android:id = "@+id/txt"
android:layout_width = "wrap_content"
android:layout_height = "wrap_content"
android:text = "@{Utils.INSTANCE.streetName()}"
/>
Функция расширения
Бывший:
fun Context.isDarkMode(): Boolean {
}
Теперь у нас есть функция расширения для темного режима, к которой можно получить доступ через контекст.
Обычно в классе Kotlin мы можем получить доступ с помощью context obj, как показано ниже.
context.isDarkMode()
Но в Xml мы не можем получить доступ, как указано выше.
Нам нужно импортировать функцию расширения, добавив KT к классу.
Бывший) Если имя вашего файла - Extensions, то для импорта следует использовать ExtensionsKt.
Импортируйте, как показано ниже, в xml.
<import type = "com.paytmmoney.core.extensions.ExtensionsKt" />
И затем мы можем получить доступ к функции расширения, как показано ниже, т.е. нам нужно передать объект, для которого мы создаем расширение, т.е. в нашем случае это контекст.
app:context='@{(ExtensionsKt.isDarkMode(context)}'
Спасибо за это, я упаковывал вызовы расширений в классы моделей. Экономит много времени!