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配置)

相关推荐
IT乐手44 分钟前
java 对比分析对象是否有变化
android·java
做时间的朋友。1 小时前
MySQL 8.0 窗口函数
android·数据库·mysql
举儿1 小时前
通过TRAE工具实现贪吃蛇游戏的全过程
android
守月满空山雪照窗1 小时前
深入理解 MTK FPSGO:Android 游戏帧率治理框架的架构与实现
android·游戏·架构
阿凤211 小时前
uniapp运行到app端怎么打开文件
android·前端·javascript·uni-app
学习使我健康2 小时前
Android 事件分发机制
android·java·前端
贵沫末2 小时前
Claude Code For VS Code安装以及跳过认证
android
00后程序员张2 小时前
完整教程:如何将iOS应用程序提交到App Store审核和上架
android·macos·ios·小程序·uni-app·cocoa·iphone
aq55356003 小时前
ThinkPHP5.x核心特性全解析
android·数据库·oracle·php·laravel
Fᴏʀ ʏ꯭ᴏ꯭ᴜ꯭.3 小时前
MySQL高可用集群实战:MHA搭建全攻略
android·mysql·adb