Android jetpack ViewBinding(一)使用篇
- 前置介绍
- ViewBinding定义
- 设置
- 使用
- [与 findViewById 的区别](#与 findViewById 的区别)
- 与DataBinding的区别
前置介绍
在学习DataBinding之前,我们先了解下ViewBinding。对比DataBinding来说,ViewBinding更加轻量级。(不需要在xml加layout)
ViewBinding定义
视图绑定是一项可让您更轻松地编写与视图交互的代码的功能。在模块中启用视图绑定之后,系统会为该模块中的每个 XML 布局文件生成一个绑定类。绑定类的实例包含对在相应布局中具有 ID 的所有视图的直接引用。
在大多数情况下,视图绑定会替代 findViewById。
设置
先确保你的Android Studio是3.6或更高的版本。
视图绑定功能可按模块启用。如需在模块中启用视图绑定,请在模块级 build.gradle 文件中将 viewBinding build 选项设置为 true
kotlin
android { // Groovy
...
buildFeatures {
viewBinding true
}
}
当然,如果要忽略某个布局文件,也可以直接将 tools:viewBindingIgnore="true" 属性添加到相应布局文件的根视图中。
使用
接下来我会在Activity\Fragment\Adapter中分别讲ViewBinding的使用
假设有一个名为 result_profile.xml 的布局文件,所生成的绑定类的名称就为 ResultProfileBinding。
kotlin
<LinearLayout ... >
<TextView android:id="@+id/name" />
<ImageView android:cropToPadding="true" />
<Button android:id="@+id/button"
android:background="@drawable/rounded_button" />
</LinearLayout>
在Activity中使用ViewBinding
在activity的onCreate()中执行以下步骤:
1、调用生成的绑定类中包含的静态 inflate() 方法。此操作会创建该绑定类的实例以供 Activity 使用。
ResultProfileBinding(自动生成)
2、调用getRoot()方法。获取对根视图的引用。
3、将根视图传递到 setContentView(),使其成为屏幕上的活动视图。
kotlin
private lateinit var binding: ResultProfileBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ResultProfileBinding.inflate(layoutInflater)
val view = binding.root
setContentView(view)
}
现在就可以使用这个绑定类来引用任何视图(通过id)
kotlin
binding.name.text = viewModel.name
binding.button.setOnClickListener { viewModel.userClicked() }
在Fragment中使用ViewBinding
在 fragment 的 onCreateView()中执行。
kotlin
private var _binding: ResultProfileBinding? = null
// This property is only valid between onCreateView and
// onDestroyView.
private val binding get() = _binding!!
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
_binding = ResultProfileBinding.inflate(inflater, container, false)
val view = binding.root
return view
}
override fun onDestroyView() {
super.onDestroyView()
_binding = null
}
注意:Fragment 的存在时间比其视图长。请务必在 fragment 的 onDestroyView() 方法中清除对绑定类实例的所有引用。
与 findViewById 的区别
与使用 findViewById 相比,视图绑定具有一些很显著的优点:
Null 安全:由于视图绑定会创建对视图的直接引用,因此不存在因视图 ID 无效而引发 Null 指针异常的风险。此外,如果视图仅出现在布局的某些配置中,则绑定类中包含其引用的字段会使用 @Nullable 标记。
类型安全:每个绑定类中的字段均具有与它们在 XML 文件中引用的视图相匹配的类型。这意味着不存在发生类转换异常的风险。
这些差异意味着布局和代码之间的不兼容将会导致构建在编译时(而非运行时)失败。
与DataBinding的区别
1、ViewBinding不支持双向数据绑定。
2、比DataBinding编译速度更快,(因为不是通过注解,而是通过gradle配置)