viewBinding的优势:空安全、只引用当前布局中的视图、支持 Java 和 Kotlin,同时也更简洁
1. 引入
尝试升级as到3.6.1或以上版本, 并升级到如下配置或更高版本。
gradle-wrapper.properties
distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.4-all.zip
build.gradle
buildscript {
dependencies {
classpath 'com.android.tools.build:gradle:3.6.1'
}
}
android {
viewBinding {
enabled = true
}
}
2. 在 Activity 中使用视图绑定
假如您有一个布局文件名叫activity_main.xml,viewBinding会为这个布局生成一个名叫 ActivityMainBinding 的类,布局文件中所有拥有 id 的视图,都会在这个类中有一个对应的属性:
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val binding = ActivityMainBinding.inflate(layoutInflater)
// 在 Activity 的 onCreate 方法中,要将 root 传入 setContentView 方法,从而让 Activity 可以使用绑定对象中的布局。
setContentView(binding.root)
binding.title.text = "Hello"
binding.subtext.text = "Concise, safe code"
binding.button.setOnClickListener { /* ... */ }
}
对使用include标签引入的布局,viewBinding会为 Module 下的每一个布局文件生成一个绑定对象,这个说法在布局文件被另一个布局文件使用 include 引入时依然适用。
include 标签也需要有一个 id 才能在绑定对象中生成对应的属性。
<include
android:id="@+id/includes"
layout="@layout/included_buttons"/>
在使用引入布局的时候,视图绑定会创建一个被引入布局绑定对象的引用。
public final class ActivityMainBinding implements ViewBinding {
...
@NonNull
public final IncludedButtonsBinding includes;