是否有可能在数据绑定中使用扩展功能? 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]发生异常: android.databinding.tool.util.LoggedErrorException:找到数据绑定 错误。 **** /数据绑定错误**** msg:在类my.package.domain.country.model.City中找不到方法streetName()
谢谢;)
答案 0 :(得分:17)
您必须首先将CityKt导入xml
<import type="my.package.domain.country.model.CityKt" />
int数据部分 那么你可以像这样使用它
<TextView
android:id="@+id/city"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{CityKt.streetName(city)}" />
如果查看CityKt,您将看到存在以City为第一个参数的静态Java方法
答案 1 :(得分:6)
虽然@ 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)}" />
答案 2 :(得分:1)
如果使用 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()}"
/>
答案 3 :(得分:1)
扩展功能
例如:
fun Context.isDarkMode(): Boolean {
}
现在我们有了可以使用上下文访问的暗模式扩展功能。
通常在 Kotlin 类中,我们可以使用如下所示的上下文 obj 进行访问。
context.isDarkMode()
但是在Xml中,我们不能像上面那样访问。
我们需要通过在类中附加 KT 来导入扩展函数。
Ex) 如果您的文件名为 Extensions,则导入应为 ExtensionsKt。
像下面这样在 xml 中导入。
<import type="com.paytmmoney.core.extensions.ExtensionsKt" />
然后我们可以像下面那样访问扩展函数,即我们需要传递我们为其创建扩展的对象,即在我们的例子中它是上下文。
app:context='@{(ExtensionsKt.isDarkMode(context)}'