当前位置: 首页 > 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.dtcms.com/a/318247.html

相关文章:

  • envFrom 是一个 列表类型字段bug
  • W3D引擎游戏开发----从入门到精通【22】
  • 《聚氨酯垫性能优化在超薄晶圆研磨中对 TTV 的保障技术》
  • 小实验--震动点灯
  • 昇思+昇腾开发板+DeepSeek模型推理和性能优化
  • Python实现信号小波分解与重构
  • 【CUDA】C2 矩阵计算
  • 大数据之Flume
  • 01--CPP入门
  • Unity里的对象旋转数值跳转问题的原理与解决方案
  • GaussDB 数据库架构师修炼(六)-2 集群工具管理-重建备库
  • 17.10 智谱AI GLM 篇:ChatGLM3-6B 快速上手
  • 【教程】C++编译官方CEF3
  • ORA-10458: standby database requires recovery
  • C++ Eigen最小二乘拟合三维直线
  • KMP-next数组详解
  • sigaction结构体详解
  • 推荐一款优质的开源博客与内容管理系统
  • 集团敏捷组织转型项目研讨材料(105页PPT)精品
  • Mac安装WebStorm for Mac v2025.1.1
  • PDF注释的加载和保存的实现
  • Enhancing Long Video Question Answering with Scene-Localized Frame Grouping
  • python中的推导式
  • Android PDFBox 的使用指南
  • 力扣热题100------136.只出现一次的数字
  • 【纵火犯的春天】纵火犯是如何解题leetcode的?
  • Python驱动的无人机多光谱-点云融合技术在生态三维建模与碳储量/生物量/LULC估算中的全流程实战
  • JDK9+ Method.class.getDeclaredFields() Method实例将不能再直接通过反射修改
  • 无人机航拍数据集|第4期 无人机太阳光伏板红外目标检测YOLO数据集10945张yolov11/yolov8/yolov5可训练
  • 大疆无人机使用eport连接Jetson主板实现目标检测