Android findViewById的官方替代品viewBinding

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;
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容