ViewBinding

1. 准备工作

首先需要在模块中启用“视图绑定”,在模块对应的build.gradle中添加配置

1
2
3
4
5
6
7
8
android {
compileSdk 32

viewBinding {
enabled = true
}
...
}

然后项目就下载了对应依赖

WechatIMG9

启用完成后,系统会为该模块下的所有布局XML文件生成一个与之对应的绑定类


2. 绑定类

布局XML中会有一些组件设置id属性,这些属性在对应的绑定类中可以直接通过id来获取,这些控件相当于类的成员,根组件和其他有id的组件的引用都包含其实例之中


2.1. 命名方式

绑定类会以“Binding”结尾,采用大驼峰

2.2. 根视图

可以通过getRoot()获取对于布局文件中根视图的引用


3. 使用

3.1. Activity中

1
2
3
4
5
6
7
8
9
10
private lateinit var binding: ActivityMainBinding

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// 调用绑定类的inflate静态方法,对象实例化
binding = ActivityMainBinding.inflate(layoutInflater)
// 获取根布局
val view = binding.root
setContentView(view)
}

然后就可以通过绑定类的实例去操作布局文件

1
2
3
4
binding.run {
ivLogo.setImageResource(R.drawable.ic_launcher_background)
tvContent.setText(R.string.app_name)
}

3.2. Fragment中

1
2
3
4
5
6
7
8
9
private lateinit var binding: FragmentBlankBinding

override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View {
binding = FragmentBlankBinding.inflate(inflater, container, false)
return binding.root
}

同样得到了布局文件绑定类的实例,然后可以使用其中的引用去操作布局中的组件

在Fragment中,由于其视图的生命周期短于Fragment自身的生命周期,因此需要在onDestroyView()中清除对绑定类实例的引用