Android jetpack ViewBinding(一)使用篇

Android jetpack ViewBinding(一)使用篇

前置介绍

在学习DataBinding之前,我们先了解下ViewBinding。对比DataBinding来说,ViewBinding更加轻量级。(不需要在xml加layout)

ViewBinding定义

视图绑定是一项可让您更轻松地编写与视图交互的代码的功能。在模块中启用视图绑定之后,系统会为该模块中的每个 XML 布局文件生成一个绑定类。绑定类的实例包含对在相应布局中具有 ID 的所有视图的直接引用。

在大多数情况下,视图绑定会替代 findViewById。

设置

先确保你的Android Studio是3.6或更高的版本。

视图绑定功能可按模块启用。如需在模块中启用视图绑定,请在模块级 build.gradle 文件中将 viewBinding build 选项设置为 true

kotlin 复制代码
android {  // Groovy
    ...
    buildFeatures {
        viewBinding true
    }
}

当然,如果要忽略某个布局文件,也可以直接将 tools:viewBindingIgnore="true" 属性添加到相应布局文件的根视图中。

使用

接下来我会在Activity\Fragment\Adapter中分别讲ViewBinding的使用

假设有一个名为 result_profile.xml 的布局文件,所生成的绑定类的名称就为 ResultProfileBinding

kotlin 复制代码
<LinearLayout ... >
    <TextView android:id="@+id/name" />
    <ImageView android:cropToPadding="true" />
    <Button android:id="@+id/button"
        android:background="@drawable/rounded_button" />
</LinearLayout>

在Activity中使用ViewBinding

在activity的onCreate()中执行以下步骤:

1、调用生成的绑定类中包含的静态 inflate() 方法。此操作会创建该绑定类的实例以供 Activity 使用。

ResultProfileBinding(自动生成)

2、调用getRoot()方法。获取对根视图的引用。

3、将根视图传递到 setContentView(),使其成为屏幕上的活动视图。

kotlin 复制代码
private lateinit var binding: ResultProfileBinding

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    binding = ResultProfileBinding.inflate(layoutInflater)
    val view = binding.root
    setContentView(view)
}

现在就可以使用这个绑定类来引用任何视图(通过id)

kotlin 复制代码
binding.name.text = viewModel.name
binding.button.setOnClickListener { viewModel.userClicked() }

在Fragment中使用ViewBinding

在 fragment 的 onCreateView()中执行。

kotlin 复制代码
private var _binding: ResultProfileBinding? = null
// This property is only valid between onCreateView and
// onDestroyView.
private val binding get() = _binding!!

override fun onCreateView(
    inflater: LayoutInflater,
    container: ViewGroup?,
    savedInstanceState: Bundle?
): View? {
    _binding = ResultProfileBinding.inflate(inflater, container, false)
    val view = binding.root
    return view
}

override fun onDestroyView() {
    super.onDestroyView()
    _binding = null
}

注意:Fragment 的存在时间比其视图长。请务必在 fragment 的 onDestroyView() 方法中清除对绑定类实例的所有引用。

与 findViewById 的区别

与使用 findViewById 相比,视图绑定具有一些很显著的优点:

Null 安全:由于视图绑定会创建对视图的直接引用,因此不存在因视图 ID 无效而引发 Null 指针异常的风险。此外,如果视图仅出现在布局的某些配置中,则绑定类中包含其引用的字段会使用 @Nullable 标记。
类型安全:每个绑定类中的字段均具有与它们在 XML 文件中引用的视图相匹配的类型。这意味着不存在发生类转换异常的风险。

这些差异意味着布局和代码之间的不兼容将会导致构建在编译时(而非运行时)失败。

与DataBinding的区别

1、ViewBinding不支持双向数据绑定。

2、比DataBinding编译速度更快,(因为不是通过注解,而是通过gradle配置)

相关推荐
爱勇宝1 小时前
我做了一个只用来搜歌词的小 App
android·前端·后端
众少成多积小致巨4 小时前
JNI (Java Native Interface) 技术手册中文参考指南
android·java·c++
Coffeeee11 小时前
如何使用Glide和Coil加载WebP动图
android·kotlin·glide
Kapaseker11 小时前
5 分钟搞懂 Kotlin DSL
android·kotlin
恋猫de小郭12 小时前
AI Agent 开发究竟是啥?如何用 AI 开发 Agent ?深入浅出给你一套概念
android·前端·ai编程
黄林晴12 小时前
Android 17 正式发布!target 37 一大批旧代码直接不能用了
android
Carson带你学Android12 小时前
Android 17 正式发布:AI 终于成了系统能力
android·前端·ai编程
三少爷的鞋13 小时前
当 UseCase 开始长期监听,它可能已经不是 UseCase 了
android
恋猫de小郭1 天前
Android 限制侧载新进展,谷歌联合国内厂商推验证计划
android·前端·flutter
恋猫de小郭1 天前
解读 Android 17 全新内存限制,有没有“豁免”后门?
android·前端·flutter