鄙人不才,之前一直认为可以直接使用以下形式,直接使用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,布局文件中外层需要添加数据绑定的标签
- "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
- }
- 。。。
- }
-
-
- +
-
-
- "1.0" encoding="utf-8"?>
"http://schemas.android.com/apk/res/android" - xmlns:app="http://schemas.android.com/apk/res-auto"
- xmlns:tools="http://schemas.android.com/tools">
-
- //这个data标签也不能少
-
-
-
-
- // 你的布局内容
- 。。。
-
-
-
- 这样用
-
-
- val mBinding:ActivityMain2Binding = DataBindingUtil.setContentView(this,R.layout.activity_main2)
-
- mBinding.text.text = "1"
-
-