提示:此文章仅作为本人记录日常学习使用,若有存在错误或者不严谨得地方欢迎指正。
文章目录
- 一、使用ViewBinding绑定控件
- 1.1 配置ViewBinding
- 1.2 在Activity中使用ViewBinding
- 1.3 在Fragment中使用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.
为了能够使用ViewBindg,我们需要在app目录下的文件中进行配置:
plugins {· · ·}
android {
· · ·
defaultConfig {· · ·}
buildTypes {· · ·}
compileOptions {· · ·}
kotlinOptions {· · ·}
//启用ViewBinding
buildFeatures {
viewBinding = true
}
}
dependencies {· · ·}
Binding类的命名规则是将布局文件按驼峰方式重命名后,再加上Binding作为结尾。例如,我们activity_main.xml布局对应的Binding类就是ActivityMainBinding。如果有些布局文件你不希望为它生成对应的Binding类,可以在该布局文件的根元素位置加入如下声明:
<LinearLayout
xmlns:tools="/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· · ·