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文件中写一个配置

android {
    。。。

    buildFeatures {
       
        viewBinding = true
    }
    。。。
}

这样就只使用一个不用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推荐使用

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

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

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

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

1,build.gradle

android {
    。。。

    buildFeatures {
        //以下两个都要配置
        dataBinding = true
        viewBinding = true
    }
    。。。
}

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

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools">

    //这个data标签也不能少
    <data>

    </data>

    // 你的布局内容
    。。。

</layout>

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

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

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来创建绑定:

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

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

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

1,ViewBinding

android {
    。。。

    buildFeatures {
       
        viewBinding = true
    }
    。。。
}


直接这样用


val mBinding = ActivityMainBinding.inflate(layoutInflater)
setContentView(mBinding.root)
mBinding.textview.text = "1"

2,DataBindingUtil

android {
    。。。

    buildFeatures {
        //以下两个都要配置
        dataBinding = true
        viewBinding = true
    }
    。。。
}


+


<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools">

    //这个data标签也不能少
    <data>

    </data>

    // 你的布局内容
    。。。

</layout>


这样用


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

mBinding.text.text = "1"


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值