当前位置: 首页 > news >正文

Android 之 ViewBinding 实现更安全、高效的视图绑定

​一、配置说明​

  1. ​作用位置​

    需在模块级 build.gradle或 build.gradle.kts文件的 android {}块内添加:

    android {buildFeatures {viewBinding = true // Kotlin DSL 语法}
    }
    android {buildFeatures {viewBinding true // Groovy 语法}
    }

  2. ​生成规则​

    • 为每个 XML 布局文件(如 activity_main.xml)生成对应的绑定类(如 ActivityMainBinding)。

    • 绑定类包含布局中所有带 android:id的视图引用,无需手动调用 findViewById()

  3. ​忽略特定布局​

    若无需为某布局生成绑定类,可在其根节点添加:

<LinearLayout...tools:viewBindingIgnore="true">
</LinearLayout>

二、使用示例​

​1. Activity 中绑定视图​
class MainActivity : AppCompatActivity() {private lateinit var binding: ActivityMainBindingoverride fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)binding = ActivityMainBinding.inflate(layoutInflater)setContentView(binding.root) // 设置根视图// 直接访问视图(类型安全 & 空安全)binding.textView.text = "Hello, View Binding!"binding.button.setOnClickListener { Toast.makeText(this, "Clicked", Toast.LENGTH_SHORT).show()}}
}
2. Fragment 中绑定视图(避免内存泄漏)​
class ExampleFragment : Fragment() {private var _binding: FragmentExampleBinding? = nullprivate val binding get() = _binding!! // 非空断言override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {_binding = FragmentExampleBinding.inflate(inflater, container, false)return binding.root}override fun onViewCreated(view: View, savedInstanceState: Bundle?) {binding.textView.text = "Fragment Loaded"}override fun onDestroyView() {super.onDestroyView()_binding = null // 释放视图引用}
}

三、核心优势​

​特性​

​说明​

​类型安全​

自动推断视图类型(如 TextView而非 View),避免强制转换错误

​空安全​

仅绑定布局中声明 id的视图,避免 NullPointerException

​性能优化​

编译时生成代码,无运行时反射开销,比 findViewById快 2-3 倍

​代码简洁​

一行绑定代替多次 findViewById,减少模板代码

五、与 DataBinding 对比​

​特性​

View Binding

Data Binding

​视图绑定​

​数据绑定​

✅(支持 @{}表达式)

​双向绑定​

​性能开销​

⚡️ 接近零开销

⚠️ 较高(需处理表达式逻辑)

​适用场景​

纯 UI 操作

数据驱动 UI(如 MVVM 架构)

http://www.lryc.cn/news/612292.html

相关文章:

  • 【渲染流水线】[应用阶段]-[裁剪]以UnityURP为例
  • CGAL Kernel 和 Traits 类深度解析:从官方教程到实践应用
  • prefetch 下载 GEO 数据注意事项
  • Milvus 向量数据库
  • 使用 Helm 在 Kubernetes 中安装 Milvus
  • 安装向量数据库Milvus
  • C++实现线程池(3)缓存线程池
  • Chrontel昆泰-【CH7036A-BF】CH7036 LVDS to HDMI/VGA/LVDS Converter
  • ​ubuntu22.04系统入门 (四)linux入门命令 权限管理、ACL权限、管道与重定向
  • Qt菜单栏与工具栏实战
  • 学习 Android(十四)NDK基础
  • VGG16训练和测试Fashion和CIFAR10
  • 利用C++11和泛型编程改进原型模式
  • 学习 Android(十五)NDK进阶及性能优化
  • 功能安全和网络安全的综合保障流程
  • 分布式事务Seata、LCN的原理深度剖析
  • vue中reactive()和ref()的用法
  • selenium操作指南
  • 状态模式及优化
  • 【机器学习篇】02day.python机器学习篇Scikit-learn基础操作
  • 如何解决pip安装报错ModuleNotFoundError: No module named ‘gensim’问题
  • Session 和 JWT(JSON Web Token)
  • python:非常流行和重要的Python机器学习库scikit-learn 介绍
  • 毕业设计选题推荐之基于Spark的在线教育投融数据可视化分析系统 |爬虫|大数据|大屏|预测|深度学习|数据分析|数据挖掘
  • Packets Frames 数据包和帧
  • 大数据存储域——Hive数据仓库工具
  • 数据结构---二级指针(应用场景)、内核链表、栈(系统栈、实现方式)、队列(实现方式、应用)
  • STM32学习记录--Day8
  • 键帽(dp)
  • 【数字图像处理系列笔记】Ch03:图像的变换