【问题标题】:Kotlin - Generic Binding for FunctionKotlin - 函数的通用绑定
【发布时间】:2021-03-03 20:32:40
【问题描述】:

我有一个使用视图的函数,该视图可以处理两种不同的布局,因为这两种布局具有相同的资源名称。我正在更新代码以使用数据绑定,但我想继续使用能够处理两种布局的通用函数,而不是将其拆分为两个不同绑定的两个函数。我最初认为我可以像这样使用 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,但这正是我试图避免的问题,因为在调用函数之前我不知道要使用哪个数据绑定。

有什么方法可以保持这种通用格式,以便我可以将相应的布局插入到函数中,因为布局使用相同的资源名称?

【问题讨论】:

    标签: android kotlin android-databinding


    【解决方案1】:

    简短的回答:我建议分别为两者编写代码,而不是为此使用数据绑定,或者查看一下以这种方式进行布局是否真的有意义。

    长答案: 如果没有更多细节并试图自己重新创建这种情况,我会说你想要做的事情要么是不可能的,要么是非常非常规的。数据/视图绑定在构建时根据您的 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。它无法访问ItemChat1BindingItemChat2Binding 将拥有的属性。

    我能想到的唯一一项工作是需要您为 ViewDataBinding 编写一个包装器的大量工作,但我建议不要这样做。我在质疑为什么您希望拥有 2 个具有相同资源名称的不同布局/视图,而不是一个具有高度灵活性的布局/视图。

    【讨论】:

      猜你喜欢
      • 2018-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-31
      相关资源
      最近更新 更多