一、配置支持
viewBinding{
enabled = true
}
或者
buildFeatures {
viewBinding true
}
二、和DataBinding比较
【1】ViewBinding的特点
仅仅支持绑定 View
不需要在布局文件中添加 layout 标签
需要在模块级 build.gradle 文件中添加 viewBinding = true 即可使用
效率高于 DataBinding,因为避免了与数据绑定相关的开销和性能问题
相比于 kotlin-android-extensions 插件避免了空异常
【2】DataBinding的特点
包含了 ViewBinding 所有的功能
需要在模块级 build.gradle 文件内添加 dataBinding = true 并且需要在布局文件中
添加 layout 标签才可以使用
支持 data 和 view 双向绑定
效率低于 ViewBinding,因为注释处理器会影响数据绑定的构建时间。
三、ViewBinding 的使用
如果不想为某个布局生成 binding 类,将下面属性添加到布局文件的根视图中
<LinearLayout tools:viewBindingIgnore="true" >
</LinearLayout>
在 Activity 中使用:
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val binding: ActivityMainBinding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
}
在 Fragment 中使用:
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?): View {
val binding = FragmentViewBindBinding.inflate(inflater,container,false)
return binding.root
}
在 Adapter 中的使用:
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int):
RecyclerView.ViewHolder {
RecycleItemProductBinding.inflate(LayoutInflater.from(parent.context), parent, false)
}
在 Dialog 中使用:
override fun onCreate(savedInstanceState: Bundle?) {
binding = DialogAppBinding.inflate(layoutInflater)
setContentView(binding.root)
}
include 标签的使用:
include 标签不带 merge 标签,需要给 include 标签添加 id, 直接使用 id 即可,用法如下所示:
<include
android:id="@+id/include"
layout="@layout/layout_include_item" />
binding.include.includeTvTitle.setText("")
include 标签带 merge 标签,注意这里和 DataBinding 用法不一样,给 include 标签添加 id,在 DataBinding 中可以直接使用 id,
ViewBinding 则不行,ViewBinding 的用法如下所示:
<include layout="@layout/layout_merge_item" />
val mergeItemBinding = LayoutMergeItemBinding.bind(binding.root)
mergeItemBinding.mergeTvTitle.setText("")
ViewStub 标签的使用:
<ViewStub
android:id="@+id/stub"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout="@layout/view_stub" />
binding.stub.setOnInflateListener { stub, inflated ->
// ViewBinding
val viewStub: ViewStubBinding = ViewStubBinding.bind(inflated)
viewStub.tvTitle.setText("")
}
if (!binding.stub.isInflated) {
binding.stub.viewStub!!.inflate()
}
[本章完...]
网友评论