赞
踩
提示:此文章仅作为本人记录日常学习使用,若有存在错误或者不严谨得地方欢迎指正。
在之前的项目中我们都是通过kotlin-android-extensions插件来绑定View控件的,很遗憾在Android Studio 4.1之后kotlin-android-extensions插件已被废弃,现在推荐使用ViewBinding来进行替代。
我的Android Studio版本是:Android Studio Giraffe | 2022.3.1 Patch 3
我的Gradle版本是:gradle-8.0-bin.zip
为了能够使用ViewBindg,我们需要在app目录下的build.gradle.kts文件中进行配置:
plugins {· · ·}
android {
· · ·
defaultConfig {· · ·}
buildTypes {· · ·}
compileOptions {· · ·}
kotlinOptions {· · ·}
//启用ViewBinding
buildFeatures {
viewBinding = true
}
}
dependencies {· · ·}
Binding类的命名规则是将布局文件按驼峰方式重命名后,再加上Binding作为结尾。例如,我们activity_main.xml布局对应的Binding类就是ActivityMainBinding。如果有些布局文件你不希望为它生成对应的Binding类,可以在该布局文件的根元素位置加入如下声明:
<LinearLayout
xmlns:tools="http://schemas.android.com/tools"
...
tools:viewBindingIgnore="true">
...
</LinearLayout>
在Activity中使用ViewBinding也很简单,如下所示:
class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) //初始化ViewBinding控件 var myBinding = ActivityMainBinding.inflate(layoutInflater) //把根元素的对象作为参数传入到setContentView()方法中 setContentView(myBinding.root) //startServiceBtn是一个按钮的id myBinding.startServiceBtn.setOnClickListener { //Code Logic } //stopServiceBtn是一个按钮的id myBinding.stopServiceBtn.setOnClickListener { //Code Logic } } }
这里需要注意,我们先是通过调用Binding类的getRoot()方法得到activity_main.xml中根元素的对象,然后把根元素的对象作为参数传入到setContentView()方法中。
//初始化ViewBinding控件
var myBinding = ActivityMainBinding.inflate(layoutInflater)
//必须使用myBinding的root设定View才可以使用Binding
setContentView(myBinding.root)
必须在setContentView()方法中使用activity_main.xml中根元素的对象才可以正常使用Binding,否则没有办法监听按钮的点击事件。并且,我们需要在ViewBinding初始化之后,再调用setContentView()方法设置主界面的布局。
如果需要在onCreate()函数之外的地方对控件进行操作,那么就得将binding变量声明成全局变量,写法如下:
class MainActivity : AppCompatActivity() { //全局变量myBinding private lateinit var myBinding: ActivityMainBinding override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) //初始化ViewBinding控件 myBinding = ActivityMainBinding.inflate(layoutInflater) //把根元素的对象作为参数传入到setContentView()方法中 setContentView(myBinding.root) //startServiceBtn是一个按钮的id myBinding.startServiceBtn.setOnClickListener { //Code Logic } //stopServiceBtn是一个按钮的id myBinding.stopServiceBtn.setOnClickListener { //Code Logic } } }
由于Kotlin声明的变量都必须在声明的同时对其进行初始化。而这里我们显然无法在声明全局binding变量的同时对它进行初始化,所以这里又使用了lateinit关键字对binding变量进行了延迟初始化。
To be continue· · ·
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。