49

是否有可能将扩展功能与数据绑定一起使用?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()}" />

我的.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()

谢谢 ;)

4

4 回答 4

95

您必须先将 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 方法

于 2018-08-05T14:02:49.283 回答
15

虽然@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)}" />
于 2020-01-15T16:56:05.800 回答
2

扩展功能

前任:

fun Context.isDarkMode(): Boolean {

 }

现在我们有了可以使用上下文访问的暗模式扩展功能。

通常在 Kotlin 类中,我们可以使用上下文 obj 访问,如下所示。

context.isDarkMode()

但是在 Xml 中,我们不能像上面那样访问。

我们需要通过将 KT 附加到类来导入扩展功能。

例如)如果你的文件名是 Extensions,那么 import 应该是 ExtensionsKt。

在xml中导入如下。

 <import type="com.paytmmoney.core.extensions.ExtensionsKt" />

然后我们可以像下面那样访问扩展函数,即我们需要传递我们正在为其创建扩展的对象,即在我们的例子中它是上下文。

  app:context='@{(ExtensionsKt.isDarkMode(context)}'
于 2021-03-26T06:10:14.900 回答
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()}"
              />
于 2021-01-19T12:42:13.910 回答