鄙人不才,之前一直认为可以直接使用以下形式,直接使用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"