如何解决Kotlin - 函数的通用绑定
我有一个函数,它使用的视图可以处理两种不同的布局,因为这两种布局具有相同的资源名称。我正在更新代码以使用数据绑定,但我想继续使用能够处理两种布局的通用函数,而不是将其拆分为两个不同绑定的两个函数。我最初认为我可以像这样使用 DataBindingUtil 这样做:
fun LoadChatMessage(context: Context,itemView: View,itemID: Int,item: Chat) {
val itemBinding = DataBindingUtil.inflate(LayoutInflater.from(context),itemID,itemView as ViewGroup,false)
}
在这种情况下,itemID 是两个布局的 layoutId,R.layout.chat_1 或 R.layout.chat_2(示例名称)。但是,我不能使用它,因为它被认为没有足够的信息来膨胀 DataBindingUtil。我尝试对 layoutIds 进行硬编码,但这不是问题。修复错误消息的唯一方法是将 itemBinding 声明为 ItemChat1Binding 或 ItemChat2Binding,但这正是我试图避免的问题,因为在调用函数之前我不知道要使用哪个数据绑定。
有没有办法保留这种通用格式,以便我可以将相应的布局插入到函数中,因为布局使用相同的资源名称?
解决方法
简短回答:我建议分别为两者编写代码,不要为此使用数据绑定,或者查看一下以这种方式进行布局是否真的有意义。
长答案: 如果没有更多细节并试图自己重新创建这种情况,我会说你想要做的要么是不可能的,要么是非常非常规的。数据/视图绑定在构建时根据您的 xml 生成类,其中包括与各种 xml 属性对应的字段/属性。这意味着每个文件都与特定的 xml 唯一相关联,并且对其他 xml 文件一无所知。
所谓的泛型/模板可能会有一些希望。与其多次编写相同的代码(唯一的区别是类型不同),您可以编写一次代码,但使用一种“占位符”类型,通常是 T
。
例如
fun <T: ViewDataBinding> LoadChatMessage(context: Context,itemView: View,itemID: Int,item: Chat) {
val itemBinding: T = DataBindingUtil.inflate(LayoutInflater.from(context),itemID,itemView as ViewGroup,false)
}
但是,我认为这不会让您做您想做的事情。这是因为代码最接近于了解 T 是什么类型的是它是一个 ViewDataBinding。它将无法访问 ItemChat1Binding
或 ItemChat2Binding
将拥有的属性。
我能想到的唯一一项工作是围绕要求您为 ViewDataBinding 编写包装器的大量工作,但我建议不要这样做。我在质疑为什么您想要具有相同资源名称的 2 个不同布局/视图,而不是具有高度灵活性的一个布局/视图。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。