kotlin中使用ViewBinding绑定控件
什么是ViewBinding?
- View Binding是Android Studio 3.6推出的新特性,主要用于减少findViewById的冗余代码,但内部实现还是通过使用findViewById。通过ViewBinding,可以更轻松地编写可与视图交互的代码。在模块中启用ViewBinding之后,系统会为该模块中的每个 XML 布局文件生成一个绑定类,绑定类的实例包含对在相应布局中具有 ID 的所有视图的直接引用。
- 在之前的项目中我们可以通过kotlin-android-extensions插件来绑定View控件的,很遗憾在Android Studio 4.1之后kotlin-android-extensions插件已被废弃,现在推荐使用ViewBinding来进行替代。
- 注意:视图绑定在 Android Studio 3.6 Canary 11 及更高版本中可用
配置ViewBinding
- 在app级别的build.gradle中的android闭包中添加buildFeatures,设置viewBinding 为 true
android {
namespace xxx
compileSdkVersion versions.compileSdk
defaultConfig {
...
}
compileOptions {
...
}
buildFeatures{
viewBinding true
}
}
-
配置完成后 Sync一下gradle,编译项目后会在build→generated→data_binding_base_class_source_out文件中生成相应的类。Binding类的命名规则是将布局文件按驼峰方式重命名后,再加上Binding作为结尾。例如,我们activity_main.xml布局对应的Binding类就是ActivityMainBinding。
-
如果有些布局文件你不希望为它生成对应的Binding类,可以在该布局文件的根元素位置加入
tools:viewBindingIgnore="true"
使用ViewBinding
- 在Activity使用viewbing,如下代码所示。注意:我们需要先Binding类的getRoot方法获取到对应布局文件的根元素,然后将其传入到setContentView方法中,否则设置监听事件会无法生效
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
//初始化ViewBinding控件
var myBinding = ActivityMainBinding.inflate(layoutInflater)
//把根元素的对象作为参数传入到setContentView()方法中
setContentView(myBinding.root)
//botton是activity_main.xml中的一个按钮id
myBinding.botton.setOnClickListener {
//Code Logic
}
}
}