使用kotlin编写Android项目时可以用kotlin合成进行视图绑定,但升级到Android Studio4.1以后,发现项目中不能直接通过控件名称引用视图了,当时还不清楚原因,只是发现gradle文件中没有添加kotlin扩展库,添加kotlin扩展库就可以像原来一样直接引用控件。
今天创建了一个新的Android App,像往常一样在gradle文件中添加了kotlin扩展库。Build时发现Build Output窗口中有一行提示,表示kotlin合成已经被弃用,应该使用JetPack的视图绑定(View Binding)来替代,并给出了相应的网址。考虑到国内打不开developer.android.com这个网址(其实可以用developer.andoid.google.cn代替),还是把步骤写在这里。
- 创建新项目后,在gradle(app)文件中加入
android {
...
viewBinding {
enabled = true
}
}
- 在每个Activity中声明一个绑定类变量。绑定类是系统自动为Activity布局文件生成的,生成的类名规则是:将 XML 文件的名称转换为驼峰式大小写,并在末尾添加“Binding”一词。比如MainActivity的布局文件为activity_main.xml,绑定类就是ActivityMainBinding。
private lateinit var binding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
val view = binding.root
setContentView(view)
}
然后就可以使用binding.控件名称
的方式来引用视图了,如:
binding.textViewName.text = "test"
binding.button.setOnClickListener{
……
}
在Fragement中使用视图绑定也是差不多的,直接把官网的代码贴到这里:
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() 方法中清除对绑定类实例的所有引用。