Android的视图绑定

视图绑定(ViewBinding)在开发中起到的作用是代替findViewById

初始设置

ViewBinding是按模块启动的,在使用之前需要在模块中的gradle中开启ViewBinding。

//kotlin
android {...buildFeatures {viewBinding = true}
}//groovy
android {...buildFeatures {viewBinding true}
}

使用

当我们为某个模块引入ViewBinding并Sync之后,系统会自动为该模块下的每一个xml生成一个绑定类,每个绑定类都包含该xml中的所有组件id的引用,而这些类的名称都与xml有关。例如我们已有一个布局文件名为result_profile.xml,他的绑定类名称就是ResultProfileBinding。

以下展示了如何在Activity和Fragment中使用生成的绑定类。

Activity

在onCreate中:

  1. 调用绑定类的inflate方法,目的是创建该绑定类的实例;
  2. 调用getRoot方法或使用Kotlin属性语法,获取对根视图的使用;
  3. 将第二步获取的根视图传递给setContentView方法,使其成为屏幕上的活动View。
//kotlin
private lateinit var binding: ResultProfileBindingoverride fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)binding = ResultProfileBinding.inflate(layoutInflater)//1+2setContentView(view)//3
}//java
private ResultProfileBinding binding;@Override
protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);binding = ResultProfileBinding.inflate(getLayoutInflater());//1View view = binding.getRoot();//2setContentView(view);//3
}

此后可以使用该绑定类的实例来引用任何视图:

//kotlin
private ResultProfileBinding binding;@Override
protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);binding = ResultProfileBinding.inflate(getLayoutInflater());View view = binding.getRoot();setContentView(view);
}//java
binding.name.setText(viewModel.getName());
binding.button.setOnClickListener(new View.OnClickListener() {viewModel.userClicked()
});

Fragment

Fragment和Activity中的用法差不多,需要在onCreateView方法中执行以下:

  1. 调用绑定类中的inflate方法;
  2. 调用getRoot方法或使用Kotlin属性语法获取根视图的引用;
  3. 从onCreateView中返回根视图,使其成为屏幕上的活动View。
//kotlin
//该变量只在onCreateView和onDestroyView中可见
private var _binding: ResultProfileBinding? = null
private val binding get() = _binding!!override fun onCreateView(inflater: LayoutInflater,container: viewGroup?,savedInstanceState: Bundle?
): View? {_binding = ResultProfileBinding.inflate(inflater, container, false)val view = binding.rootreturn view
}override fun onDestroyView() {super.onDetroy()_binding = null
}//java
private ResultProfileBinding binding;@Override
public View onCreateView (LayoutInflater inflater,ViewGroup container,Bundle savedInstanceState) {binding = ResultProfileBinding.inflate(inflater, container, false);View view = binding.getRoot();return view;
}@Override
public void onDestroyView() {super.onDestroyView();binding = null;
}

由于kotlin中空类型系统的存在,在fragment中的ViewBinding写法与java相比会稍显复杂,需要在新建一个变量接收绑定的实例,并给出非空断言。

与findViewById的对比

两者都可用于直接引用视图的绑定类,ViewBinding的优势在于:

  • 加快编译速度:ViewBinding不需要处理注解
  • 易于使用:不需要标记xml文件,因为每个xml都会自动生成相应的绑定类

而与findViewById即数据绑定相比,ViewBinding具有以下限制:

  • 不支持布局变量或布局表达式,因此不能直接从xml声明动态界面内容
  • 不支持双向数据绑定

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/675384.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

上位机建立TCP/IP连接:Matlab实现

Python实现的参考: Xilinx ZYNQTCP通信Python上位机 实现实时视频传输系统 - 知乎 (zhihu.com) GitHub - yg99992/Image_transfer_open_source: ZYNQ-7000 based data transfer through TCP/IP protocol 参考: MATLAB实现tcp连接 - 知乎 (zhihu.com)…

vue3-内置组件-Teleport

Teleport <Teleport> 是一个内置组件&#xff0c;它可以将一个组件内部的一部分模板“传送”到该组件的 DOM 结构外层的位置去。 基本用法 有时我们可能会遇到这样的场景&#xff1a;一个组件模板的一部分在逻辑上从属于该组件&#xff0c;但从整个应用视图的角度来看…

自然语言NLP

什么是NLP NLP&#xff08;Natural Language Processing&#xff09;是自然语言处理的缩写&#xff0c;是计算机科学和人工智能领域的一个研究方向。NLP致力于使计算机能够理解、处理和生成人类自然语言的能力。通过NLP技术&#xff0c;计算机可以通过识别和理解语言中的文本…

基于Linux操作系统的Docker容器安装MySQL随笔

1、在Linux上安装Docker容器 cd /etc/yum.repos.d/ curl -O https://download.docker.com/linux/centos/docker-ce.repo sed -i s/$releasever/8/g docker-ce.repo yum install -y docker-ce 2、修改Docker默认镜像仓库&#xff0c;然后启动Docker容器 sudo mkdir -p /etc/do…

yolov8自制数据训练集

目录 1.YOLOv8是啥 2.系统环境 3.安装labelimg 3.1安装 3.2启动 labelimg 4.自制分类图片 4.1 YOLO数据集要求 4.2 图片保存目录 4.3 利用labelimg进行标注 4.4 存储图片 4.5 标注文件 5.数据集训练 5.1yaml文件 5.2训练命令 5.3查看训练过程 5.3.1启动tensorb…

c#通过反射完成对象自动映射

在 C# 中&#xff0c;可以使用 AutoMapper 库来完成对象之间的映射&#xff0c;而不必手动编写显式的映射代码。但是&#xff0c;如果你希望通过反射来动态完成对象的映射&#xff0c;你可以编写自己的映射逻辑并使用反射来完成这个过程。 下面是一个简单的示例&#xff0c;演…

2. 四平方和

题目描述 四平方和定理&#xff0c;又称为拉格朗日定理&#xff1a; 每个正整数都可以表示为至多 4 4 4 个正整数的平方和。 如果把 0 0 0 包括进去&#xff0c;就正好可以表示为 4 4 4 个数的平方和。 比如&#xff1a; 5 0 2 0 2 1 2 2 2 50^20^21^22^2 502021222 7…

实例分割论文阅读之:FCN:《Fully Convolutional Networks for Semantica Segmentation》

论文地址:https://openaccess.thecvf.com/content_cvpr_2015/papers/Long_Fully_Convolutional_Networks_2015_CVPR_paper.pdf 代码链接&#xff1a;https://github.com/pytorch/vision 摘要 卷积网络是强大的视觉模型&#xff0c;可以产生特征层次结构。我们证明&#xff0c…

Qt网络编程-TCP与UDP

网络基础 TCP与UDP基础 关于TCP与UDP的基础这里就不过多介绍了&#xff0c;具体可以查看对应百度百科介绍&#xff1a; TCP&#xff08;传输控制协议&#xff09;_百度百科 (baidu.com) UDP_百度百科 (baidu.com) 需要知道这两者的区别&#xff1a; 可靠性&#xff1a; TC…

每天一个数据分析题(一百五十七)

当对多个连续型变量进行主成分分析&#xff08;PCA&#xff09;以降维并且简化数据时&#xff0c;以下哪项原则通常被用来决定应当保留多少个主成分&#xff1f; A. 保留的主成分个数应当使得累积方差解释比例至少达到50%。 B. 保留的主成分个数应当使得每个主成分的特征值大…

Java面向对象 方法的重写

目录 重写重写的规则实例创建Person类创建Student类测试 重载和重写的区别 重写 发生在子类和父类中&#xff0c;当子类对父类提供的方法不满意的时候&#xff0c;要对父类的方法进行重写。 重写的规则 子类的方法名字和父类必须一致&#xff0c;参数列表&#xff08;个数&…

IMU模型介绍

IMU模型 中文名惯性测量单元。 与一般的认知不同&#xff0c;机器人状态估计问题一般将IMU的测量作为运动信息&#xff0c;根据运动方程预测状态&#xff0c;这与里程计相似&#xff0c;尽管是传感器&#xff0c;但被看成执行器&#xff08;当然与真正的执行机构是不同的&…

15章-Python编程:从入门到实践

第15章生成数据 数据可视化指的是通过可视化表示来探索数据&#xff0c;它与数据挖掘数紧密相关&#xff0c;而数据挖掘指的是使用代码来探索数据集的规律和关联。 数据集可以是用一行代码就能表示的小型数字列表&#xff0c;也可以是数以吉字节的数据。漂亮地呈现数据关乎的并…

List 差集

文章目录 基本类型对象类型 基本类型 ListUtils.subtract 方法用于计算两个集合的差集&#xff0c;即返回 list1 中有但 list2 中没有的元素。 其中&#xff0c;list1 指向第一个集合&#xff0c;list2 指向第二个集合。该方法返回一个新的 List 对象&#xff0c;它包含所有在…

C++:二叉搜索树模拟实现(KV模型)

C&#xff1a;二叉搜索树模拟实现&#xff08;KV模型&#xff09; 前言模拟实现KV模型1. 节点封装2、前置工作&#xff08;默认构造、拷贝构造、赋值重载、析构函数等&#xff09;2. 数据插入&#xff08;递归和非递归版本&#xff09;3、数据删除&#xff08;递归和非递归版本…

开源免费的物联网网关 IoT Gateway

1. 概述 物联网网关&#xff0c;也被称为IOT网关&#xff0c;是一种至关重要的网络设备。在物联网系统中&#xff0c;它承担着连接和控制各种设备的重要任务&#xff0c;将这些设备有效地连接到云端、本地服务器或其他设备上。它既能够在广域范围内实现互联&#xff0c;也能在…

P1297 [国家集训队] 单选错位 对期望的理解

[国家集训队] 单选错位 - 洛谷 思路&#xff1a; 其实每个位置的得分只和前一个位置有关。 而他们俩的所有情况的期望就是答案的这部分。 ——这是难想的&#xff0c;我期望学的不好。 &#xff08;题目给的是每种情况的所有位置的和&#xff0c;全加起来是答案&#xff1…

【龙年大礼】| 2023中国开源年度报告!

【中国开源年度报告】由开源社从 2015 年发起&#xff0c;是国内首个结合多个开源社区、高校、媒体、风投、企业与个人&#xff0c;以纯志愿、非营利的理念和开源社区协作的模式&#xff0c;携手共创完成的开源研究报告。后来由于一些因素暂停&#xff0c;在 2018 年重启了这个…

基于 Python opencv 的人脸识别的酒店客房入侵系统的检测

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12W、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

掌握C++中的动态数据:深入解析list的力量与灵活性

1. 引言 简介std::list和其在C中的角色 std::list是C标准模板库&#xff08;STL&#xff09;中提供的一个容器类&#xff0c;实现了双向链表的数据结构。与数组或向量等基于连续内存的容器不同&#xff0c;std::list允许非连续的内存分配&#xff0c;使得元素的插入和删除操作…