首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

  • 24-12-05 23:25
  • 3952
  • 6959
juejin.cn

1. ViewBinding 是什么?

Android ViewBinding 是 Android 官方推出的一种数据绑定库,旨在简化视图和代码之间的交互,提供了一种类型安全的方式来访问视图的属性和方法。

ViewBinding 可以自动生成绑定视图的代码,避免手动 findViewById 的繁琐过程,使代码更加简洁。

2. 如何使用 ViewBinding

2.1 相关配置

build.gradle 文件中进行如下配置:

groovy
代码解读
复制代码
android { ... buildFeatures { viewBinding true } }

ViewBinding 会为每个 layout 布局文件生成一个对应的绑定类,如果希望忽略某一个布局文件,需要在该文件的根布局添加 tools:viewBindingIgnore="true" 属性:

xml
代码解读
复制代码
<LinearLayout         ...         tools:viewBindingIgnore="true" >     ... LinearLayout>

2.2 用法

假设 activity_main.xml 如下:

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

生成绑定类的名称命名规则:将 XML 文件的名称转换为 Pascal 大小写形式,并在末尾添加“Binding”。activity_main.xml -> ActivityMainBinding

每个绑定类还包含一个 getRoot() 方法,直接可以获取到对应布局文件的根视图的引用(LinearLayout)。

用法总结:通过绑定类的 inflate() 方法获取绑定类实例,此方法需传入 LayoutInflater 的实例,然后调用绑定类的 getRoot() 方法即可获取根视图。

2.1.1 在 Activity 中使用

java
代码解读
复制代码
private ActivityMainBinding binding; @Override protected void onCreate(Bundle savedInstanceState) {     super.onCreate(savedInstanceState);     binding = ActivityMainBinding.inflate(getLayoutInflater());     View view = binding.getRoot();     setContentView(view); binding.name.setText(viewModel.getName()); binding.button.setOnClickListener(new View.OnClickListener() { viewModel.userClicked() }); }
  1. 通过绑定类的 inflate() 方法获取绑定类实例。
  2. 调用 getRoot() 方法获取根视图。
  3. 将根视图传递给 setContentView。

2.1.2 在 Fragment 中使用

java
代码解读
复制代码
private ActivityMainBinding binding; @Override public View onCreateView (LayoutInflater inflater,                           ViewGroup container,                           Bundle savedInstanceState) {     binding = ActivityMainBinding.inflate(inflater, container, false);     View view = binding.getRoot();     return view; } @Override public void onDestroyView() {     super.onDestroyView(); // Fragment 的存在时间比其视图长。     binding = null; }
  1. 通过绑定类的 inflate() 方法获取绑定类实例。
  2. 调用 getRoot() 方法获取根视图。
  3. 在 onCreateView 方法中返回根视图。

2.1.3 针对不同配置下的 layout 文件

xml
代码解读
复制代码
# in res/layout/example.xml <TextView android:id="@+id/user_bio" /> # in res/layout-land/example.xml <EditText android:id="@+id/user_bio" />

TextView 是 TextView 和 EditText 的公共基类。但是 ViewBinding 无法识别,系统会自动转为 View 对象,需手动转为 TextView 对象。

为了解决这个缺陷,ViewBinding 提供了 tools:viewBindingType 属性,用于告知编译器要在生成的代码中使用何种类型:

xml
代码解读
复制代码
# in res/layout/example.xml (unchanged) <TextView android:id="@+id/user_bio" /> # in res/layout-land/example.xml <EditText android:id="@+id/user_bio" tools:viewBindingType="TextView" />

3. 原理

编译的时候会去扫描 layout 文件,生成对应的 binding 类:

image.png

image.png

其内部实现很简单,就是通过传入的 LayoutInflater 对象去加载相应的布局文件,并返回了 rootView。简化视图和代码之间的交互,使代码更简洁。

用法总结:通过绑定类的 inflate() 方法获取绑定类实例,此方法需传入 LayoutInflater 的实例,然后调用绑定类的 getRoot() 方法即可获取根视图。

点击阅读 LayoutInflater 的原理:Android LayoutInflater 源码详解

注:本文转载自juejin.cn的无限进化的文章"https://juejin.cn/post/7444515085333626892"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2492) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

140
Android
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2025 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top