手动开启ViewBinding

先在app级别的build.gradle中启用ViewBinding

1
2
3
4
5
6
7
android {
...
buildFeatures {
// 启用viewBinding
viewBinding true
}
}

ViewBinding启用后,编译项目,在build\generated\data_binding_base_class_source_out生成各个layout对应的Binding类,Binding类的命名规则为Layout的名字换成大驼峰式写法,并且在尾部加上Binding,默认会给每个layout生成对应的Binding类,如果某个layout不需要生成,可以在layout的根节点加上tools:viewBindingIgnore="true"属性

1
2
3
4
5
6
<androidx.constraintlayout.widget.ConstraintLayout
...
tools:viewBindingIgnore="true"
...>

</androidx.constraintlayout.widget.ConstraintLayout>

创建MainActivity,布局文件为activity_main.xml,将会生成对应的MainActivityBinding

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">

<Button
android:id="@+id/button1"
android:text="Button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toStartOf="@id/button2"/>

<Button
android:id="@+id/button2"
android:text="Button2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintTop_toTopOf="@id/button1"
app:layout_constraintTop_toBottomOf="@id/button1"
app:layout_constraintStart_toEndOf="@id/button1"
app:layout_constraintEnd_toEndOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

MainActivity中使用ViewBinding,首先声明binding变量

1
2
// 使用lateinit关键字声明一个延迟初始化的变量
private lateinit var binding: ActivityMainBinding

然后在onCreate方法中,在setContentView方法之前,调用ActivityMainBinding.inflate方法,将布局文件加载到binding变量中,再调用setContentView方法,将binding变量中的根视图设置为当前活动的内容视图

1
2
3
4
5
6
7
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// 将布局文件加载到binding变量中
binding = ActivityMainBinding.inflate(layoutInflater)
// 将binding变量中的根视图设置为当前活动的内容视图
setContentView(binding.root)
}

现在即可在MainActivity中使用binding变量来访问布局文件中的视图,例如binding.button1binding.button2

1
2
3
4
5
6
7
binding.button1.setOnClickListener {
Toast.makeText(this, "按钮1", Toast.LENGTH_SHORT).show()
}

binding.button2.setOnClickListener {
Toast.makeText(this, "按钮2", Toast.LENGTH_SHORT).show()
}