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

相关推荐
筱顾大牛2 小时前
黑马点评---用户签到、UV统计
android·服务器·uv
耶叶2 小时前
Android开发实战:通过网络电子书阅读器实践运用fragment知识
android·jvm
00后程序员张2 小时前
iPhone 无需越狱文件管理 使用Keymob查看导出文件
android·ios·小程序·https·uni-app·iphone·webview
kcuwu.2 小时前
Python文件操作零基础及进阶
android·服务器·python
锋风Fengfeng2 小时前
Windows怎么方便查看AOSP代码
android·windows
2501_916008892 小时前
Unity3D iOS 应用防篡改实战 资源校验、 IPA 二进制保护
android·ios·小程序·https·uni-app·iphone·webview
Kapaseker2 小时前
Compose 中 CompositionLocalProvider 到底是干啥的
android·kotlin
mg6682 小时前
安卓玩机工具----安卓设备adb调试图形化工具推荐 支持mac与windows
android·adb
wzl202612132 小时前
多账号协同与任务分发:用企微API搭建总部-门店统一运营中台
android·企业微信