具有扩展方法的 Kotlin 数据绑定

2024-04-03

我正在尝试在 Android 的数据绑定中使用 Kotlin 扩展方法。例如;调用 onclick 处理程序。所以我编写了这段代码:

posttest_list_item.xml

<?xml version="1.0" encoding="utf-8"?>
<data>
    <import type="android.view.View"/>
    <import type="com.example.test.post.posttest.PostTestItemViewModelExtensionKt" />
    <variable
        name="viewModel"
        type="com.example.test.post.posttest.PostTestItemViewModel" />
</data>
<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:paddingLeft="16dp"
    android:paddingRight="16dp"
    android:clickable="true"
    android:onClick="@{(view) -> viewModel.clicked(view)}"
    >
[...]

PostTestItemViewModel.kt

open class PostTestItemViewModel : ViewModel() {
    val postTitle = MutableLiveData<String>()
    val postBody = MutableLiveData<String>()

   /**
    * Binds the required properties/entities to this ViewModel
    */
   fun bind(post: Post) {
       postTitle.value = post.title
       postBody.value = post.body
   }
}

PostTestItemViewModelExtension.kt

fun PostTestItemViewModel.clicked(v: View) {
    this.postTitle.value = "clicked"
}

因此,当我将单击的方法放置在视图模型中时,它会按照应有的方式完美运行。但是,当我将其创建为扩展方法时,我在编译时收到以下错误:

e:[kapt]发生异常:android.databinding.tool.util.LoggedErrorException:发现数据绑定错误。 在类中找不到单击的方法(android.view.View)...PostItemViewModel

我已经尝试过不同的事情,例如更改android:onclick tag to PostTestItemViewModelExtensionKt代替viewModel。不幸的是,所有的事情似乎都不起作用。所以看起来扩展方法是在数据绑定发生后生成的。有办法解决这个问题还是我仍然做错了什么?或者只是不可能绑定扩展方法?

我正在使用 Kotlin 版本 1.2.71,gradle 3.2.0 并且有databinding { enabled = true } and kapt { generateStubs = true }添加到我的 .gradle 中,并拥有插件kotlin-android, kotlin-android-extensions and kotlin-kapt定义的。


不幸的是你不能使用扩展方法onClick回调。

Kotlin 中的扩展方法被创建为 Java 静态方法,而 Android 框架需要实例方法。

请注意,在 Android Studio 中,您可以将 Kotlin 类反编译为 Java 以查看生成的 Java 代码。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

具有扩展方法的 Kotlin 数据绑定 的相关文章

随机推荐

  • 将 GLSurfaceView 类与 Android xml 布局结合使用

    我想利用 android xml 布局 我已将 glSurfaceView 放入框架布局中 以便与线性布局结合使用 如下所示
  • 使用 Swift 将当前时间设置为 yyyy-MM-dd 00:00:00

    我想问一下NSDate 如何设置 格式化当前时间 如 2015 08 12 09 30 41 0000 到 2015 08 12 00 00 00 0000 我已经在使用 var dateFormatter NSDateFormatter
  • Python doctest:有条件地跳过测试

    我知道如何使用跳过文档测试 doctest SKIP 但我不知道如何跳过测试有时 基于运行时条件 例如 gt gt gt if os path isfile foo open foo readlines else pass doctest
  • jQuery 取消和重置幻灯片动画

    我正在编写一些 jQuery 来切换 div 在伪代码中 应该执行以下操作 item click check to see if the div I want to expand is hidden if so slideup all of
  • 如何汇总正在进行的编程

    我正在为 MRP 程序编写一份报告 其中包含一个我计算的订购数量的字段 如果它是小数点 我需要将其四舍五入 例如 2 33需要向上舍入为3等等 我努力了 oder round order 0 但这只给我 2 00 我需要将该数字四舍五入到下
  • 如何在使用按位运算添加两个整数时添加无限循环的代码修复

    这是原件question https stackoverflow com questions 39113479 infinite loop while adding two integers using bitwise operations
  • 正则表达式用于匹配某些内容(如果前面没有其他内容)

    对于Java中的正则表达式 我想编写一个当且仅当模式前面没有某些字符时才匹配的正则表达式 例如 String s foobar barbar beachbar crowbar bar 我想匹配如果bar前面没有foo 所以输出将是 barb
  • 在 Cocoa/Carbon 中全局隐藏鼠标光标?

    有没有办法全局隐藏 Cocoa 或 Carbon 中所有应用程序的鼠标光标 或者至少用其他东西代替它 编辑 感谢大家的意见 但事实证明 Daniel Jalkut 不久前找到了解决方案 http lists apple com archiv
  • Lisp 中的数组与列表:为什么下面的代码中的列表要快得多?

    我在解决时得到了意想不到的结果欧拉计划中的问题 75 https projecteuler net problem 75 我的代码确实找到了正确的解决方案 但它的行为很奇怪 我的解决方案包括遍历毕达哥拉斯树 巴宁矩阵 https en wi
  • 如何将xml解析为java对象? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我有一个用于配置一些规则的XML 它没有复杂的结构 但是这个配置在我的系统中的任何地方使用 所以我想将此XML解析为java对象并设计
  • 使用已删除的名称创建 Azure API 管理会导致名称“已在使用中”错误

    我之前使用 Terraform 创建并随后删除了 Azure API 管理服务 它消失在Azure Portal中 几个小时后 当我尝试使用相同名称重新创建 API 管理时 我在 Azure 门户中收到此错误 name already in
  • R ranger 包中的预测概率

    我正在尝试在 R 中建立一个具有随机森林分类的 模型 通过 Ned Horning 编辑代码 我首先使用randomForest包但后来发现ranger 这保证了更快的计算 首先 我使用下面的代码在拟合模型后获得每个类别的预测概率rando
  • 编译器如何为 C++ 中条件声明的自动变量分配内存?

    假设我有一个函数 根据某些运行时条件创建昂贵的自动对象或创建便宜的自动对象 void foo if runtimeCondition int x 0 else SuperLargeObject y 当编译器为此函数分配堆栈帧的内存时 它是否
  • jquery selectedIndex 不起作用

    我有一个带有许多选择标签的 from 当用户提交表单时 我想检查用户是否为所有选择标签选择一个选项 这是我的 jquery 代码 apForm select each function var this this if this selec
  • Kubernetes 配置映射符号链接 (..data/):有办法避免它们吗?

    我注意到 当我创建并安装包含一些文本文件的配置映射时 容器会将这些文件视为符号链接 data myfile txt 例如 如果我的配置映射名为 tc configs 并包含 2 个名为 stripe1 xml 和 stripe2 xml 的
  • CSS Calc((100%/5)+10px) 不起作用

    好吧 在我的 CSS 中 我正在尝试进行数学计算 calc 100 5 10px 当我这样做时 它不起作用 当我计算时 100 5 它工作得很好 我需要做什么才能让 10px 正常工作 您需要做的是使用正确的语法 calc 100 5 10
  • 如何在 Ionic 框架中使用 CSS 选择器隔离特定平台

    我遇到了一种罕见的情况 尽管考虑到 Android 和 iOS 之间的行为不同 这是可以理解的 我想在我正在 Ionic 框架上开发的 Cordova 应用程序中使用专门针对 iOS 的不同样式 我想知道基于平台隔离选择器的最佳方法 基本上
  • 如何通过azure云服务上的kubernetes检查持久卷的内容

    我已将软件打包到容器中 我需要通过Azure容器服务将容器放入集群 该软件具有目录的输出 src data 我想访问整个目录的内容 搜索后 我必须解决 在azure上使用Blob存储 但是搜索后 我找不到可执行方法 使用持久卷 但是我找到的
  • Python Pygame 游戏灯光

    我正在制作一款 2D 横向卷轴游戏 游戏中的一个物品是火炬 我有一个手臂可以旋转的玩家 我们可以获取手臂的角度 我正在寻找跟随手臂角度的三角形光束形状 我有一些想法 比如在整个屏幕上放置一个 alpha 图像 并根据手臂角度单独从每个像素中
  • 具有扩展方法的 Kotlin 数据绑定

    我正在尝试在 Android 的数据绑定中使用 Kotlin 扩展方法 例如 调用 onclick 处理程序 所以我编写了这段代码 posttest list item xml