【23】Kotlin扩展——在Android Studio中使用ViewBinding绑定控件

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

一、使用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 {· · ·}

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

<LinearLayout
    xmlns:tools="http://schemas.android.com/tools"
    ...
    tools:viewBindingIgnore="true">
    ...
</LinearLayout>

1.2 在Activity中使用ViewBinding

在Activity中使用ViewBinding也很简单,如下所示:
Kotlin Code:

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
        }
    }
}

Java Code:

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ActivityMainBinding mainBinding = ActivityMainBinding.inflate(getLayoutInflater());
        setContentView(mainBinding.getRoot());
        mainBinding.button1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //Code Logic
            }
        });
    }
}

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

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

Java Code:

ActivityMainBinding mainBinding = ActivityMainBinding.inflate(getLayoutInflater());
        setContentView(mainBinding.getRoot());

必须在setContentView()方法中使用activity_main.xml中根元素的对象才可以正常使用Binding,否则没有办法监听按钮的点击事件。并且,我们需要在ViewBinding初始化之后,再调用setContentView()方法设置主界面的布局
如果需要在onCreate()函数之外的地方对控件进行操作,那么就得将binding变量声明成全局变量,写法如下:
Kotlin Code:

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
        }
    }
}

Java Code:

public class MainActivity extends AppCompatActivity {

    private ActivityMainBinding mainBinding;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mainBinding = ActivityMainBinding.inflate(getLayoutInflater());
        setContentView(mainBinding.getRoot());
        mainBinding.button1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //Code Logic
            }
        });
    }
}

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

1.3 在Fragment中使用ViewBinding

To be continue· · ·
  • 8
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值