当前位置:   article > 正文

【23】Kotlin扩展——在Android Studio中使用ViewBinding绑定控件_viewbinding android studio2022.3

viewbinding android studio2022.3

提示:此文章仅作为本人记录日常学习使用,若有存在错误或者不严谨得地方欢迎指正。

一、使用ViewBinding绑定控件

在之前的项目中我们都是通过kotlin-android-extensions插件来绑定View控件的,很遗憾在Android Studio 4.1之后kotlin-android-extensions插件已被废弃,现在推荐使用ViewBinding来进行替代。

1.1 配置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 {· · ·}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

Binding类的命名规则是将布局文件按驼峰方式重命名后,再加上Binding作为结尾。例如,我们activity_main.xml布局对应的Binding类就是ActivityMainBinding。如果有些布局文件你不希望为它生成对应的Binding类,可以在该布局文件的根元素位置加入如下声明:

<LinearLayout
    xmlns:tools="http://schemas.android.com/tools"
    ...
    tools:viewBindingIgnore="true">
    ...
</LinearLayout>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

1.2 在Activity中使用ViewBinding

在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
        }
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

这里需要注意,我们先是通过调用Binding类的getRoot()方法得到activity_main.xml中根元素的对象,然后把根元素的对象作为参数传入到setContentView()方法中

//初始化ViewBinding控件
var myBinding = ActivityMainBinding.inflate(layoutInflater)
//必须使用myBinding的root设定View才可以使用Binding
setContentView(myBinding.root) 
  • 1
  • 2
  • 3
  • 4

必须在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
        }
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

由于Kotlin声明的变量都必须在声明的同时对其进行初始化。而这里我们显然无法在声明全局binding变量的同时对它进行初始化,所以这里又使用了lateinit关键字对binding变量进行了延迟初始化

1.3 在Fragment中使用ViewBinding

To be continue· · ·
  • 1
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/319856
推荐阅读
相关标签
  

闽ICP备14008679号