• databindingutil.setcontentview type mismatch 从使用角度区分ViewBinding和DataBinding


            鄙人不才,之前一直认为可以直接使用以下形式,直接使用ViewBinding,而且我只想使用ViewBinding就行。

    val mBinding:ActivityMain2Binding = DataBindingUtil.setContentView(this,R.layout.activity_main2)

            但是AS报错:databindingutil.setcontentview type mismatch,

    databindingutil.setcontentview(context,layoutId)返回的是ViewDataBinding,但是一般要使用bingding直接点出控件id,是需要ViewBinding,虽然ViewBinding只是一个接口,且ViewDataBinding也继承了它,为啥就是不能直接点出来控件呢?!

            一般我只想用ViewBinding,就只会在build.gradle文件中写一个配置

    1. android {
    2. 。。。
    3. buildFeatures {
    4. viewBinding = true
    5. }
    6. 。。。
    7. }

    这样就只使用一个不用findViewById来找控件的功能,但是看到很多文章写,可以直接

    val mBinding:ActivityMain2Binding = DataBindingUtil.setContentView(this,R.layout.activity_main2)用这个mBinding就能点出控件?

    但是实操狠狠打脸我粗浅的认知,查看google文档才知道有好几种情况下使用ViewBinding的方式,具体请看:

    https://developer.android.com/topic/libraries/data-binding/generated-binding?hl=zh-cn

    一般只使用ViewBinding,Google推荐使用

    1. val mBinding = ActivityMainBinding.inflate(layoutInflater)
    2. setContentView(mBinding.root)

    这样就可以正常点出控件,直接使用了。

    但是,上边那种看起来很简洁的方式,就setContentView了怎么就不能正常点出控件呢?难道是需要mBinding.root.xxx控件,AS编译还是报错。

    查证后发现,如果使用val mBinding:ActivityMain2Binding = DataBindingUtil.setContentView(this,R.layout.activity_main2)这种方式,你还需要添加东西

    1,build.gradle

    1. android {
    2. 。。。
    3. buildFeatures {
    4. //以下两个都要配置
    5. dataBinding = true
    6. viewBinding = true
    7. }
    8. 。。。
    9. }

    2,布局文件中外层需要添加数据绑定的标签

    1. "1.0" encoding="utf-8"?>
    2. <layout xmlns:android="http://schemas.android.com/apk/res/android"
    3. xmlns:app="http://schemas.android.com/apk/res-auto"
    4. xmlns:tools="http://schemas.android.com/tools">
    5. //这个data标签也不能少
    6. <data>
    7. data>
    8. // 你的布局内容
    9. 。。。
    10. layout>

    如此编译后就能正常使用DataBindingUtil点出控件了

    1. val mBinding:ActivityMain2Binding = DataBindingUtil.setContentView(this,R.layout.activity_main2)
    2. mBinding.text.text = "1"

    其实仔细看,从字面上也能理解为啥这两中binding的方式不同了,一个是ViewBinding,强调View,可以直接使用你的layoutId自动生成的类(如:R.layout.activity_main 对应ActivityMainViewBind.java,R.layout.activity_main2 对应 ActivityMain2ViewBinding.java)来点出控件。而DataBindingUtil是强调数据绑定的,当然需要在布局文件中配置data标签,和gradle中配置dataBinding = true了。

            此外,你还可以在不知道layoutId的情况下使用DataBindingUtil来创建绑定:

    1. val viewRoot = LayoutInflater.from(this).inflater(layoutId,parent,attachToParent)
    2. val binding:ViewDataBinding? = DataBindingUtil.bind(viewRoot)

    具体情况还是看:https://developer.android.com/topic/libraries/data-binding/generated-binding?hl=zh-cn。

    好了上边说的有点啰嗦了,下面总结下:

    1,ViewBinding

    1. android {
    2. 。。。
    3. buildFeatures {
    4. viewBinding = true
    5. }
    6. 。。。
    7. }
    8. 直接这样用
    9. val mBinding = ActivityMainBinding.inflate(layoutInflater)
    10. setContentView(mBinding.root)
    11. mBinding.textview.text = "1"

    2,DataBindingUtil

    1. android {
    2. 。。。
    3. buildFeatures {
    4. //以下两个都要配置
    5. dataBinding = true
    6. viewBinding = true
    7. }
    8. 。。。
    9. }
    10. +
    11. "1.0" encoding="utf-8"?>
    12. "http://schemas.android.com/apk/res/android"
    13. xmlns:app="http://schemas.android.com/apk/res-auto"
    14. xmlns:tools="http://schemas.android.com/tools">
    15. //这个data标签也不能少
    16. // 你的布局内容
    17. 。。。
    18. 这样用
    19. val mBinding:ActivityMain2Binding = DataBindingUtil.setContentView(this,R.layout.activity_main2)
    20. mBinding.text.text = "1"

  • 相关阅读:
    在Mongodb查询语句中使用hint()
    DevOps系列文章之 Docker-compose
    mysql 学习笔记-窗口函数之开窗聚合函数
    什么是函数式编程(functional programming)?
    刷题《剑指Offer》day12
    安装rGEDI包报错(已解决)
    数据库技术基础--数据库的控制功能
    KD02策略丨涨跌幅统计+短线离场构建交易模型
    iMazing2023永久免费版苹果iOS设备管理软件
    Hystrix Dashboard断路监控仪表盘
  • 原文地址:https://blog.csdn.net/Goals1989/article/details/126953163