安卓findViewById 的优化方案:ViewBinding与ButterKnife(一)

news2024/11/13 8:58:21

好多小伙伴现在还用findViewById来获取控件的id,  在这里提供俩种替代方案:ViewBinding与ButterKnife; 先来说说ButterKnife

ButterKnife

ButterKnife是一个专注于Android系统的View注入框架,在过去的项目中总是需要很多的findViewById来查找View对象,有了ButterKnife可以轻松省去这些步骤。目前使用较为广泛,最重要的一点,使用ButterKnife对性能基本不造成损失,因为ButterKnife用的是注解而不是运行时的反射,所以最终在编译时生成了新的class文件,项目集成非常方便,用起来相对简单;

(1)使用View中的控件,代码简化
(2)程序性能不受损失
特点:
(1)使用@BindView绑定View
(2)支持多个View同时绑定,可以设置相关的动作
(3)使用类似@OnClick设置监听器
(4)可以绑定资源
如何使用?
(1)添加依赖
(2)检查依赖添加是否成功
(3)绑定

【案例】

build.gradle(project):

依赖:

classpath ‘com.jakewharton:butterknife-gradle-plugin:10.2.3’

build.gradle(module):

依赖:

implementation ‘com.jakewharton:butterknife:10.2.3’
annotationProcessor ‘com.jakewharton:butterknife-compiler:10.2.3’



MainActivity.java

 

2.ButterKnife是如何实现性能不损失的绑定?

控件是如何实例化?
使用ButterKnife自动生成了findViewById相关代码,而不是使用反射,所以性能没有损失。

3.资源的绑定

android中哪些属于资源?
图片、布局、字符串、数组、样式、主题等。
使用ButterKnife的注解可以对资源进行绑定:
@BindBool 绑定逻辑值
@BindColor 绑定颜色值
@BindDimen 绑定一个尺寸
@BindDrawable 绑定一个图片
@BindInt 绑定一个整数
@BindString 绑定一个字符串
【案例】绑定一个图片到ImageView上



MainActivity2.java



【案例】绑定字符串

strings.xml



MainActivity2.java

4.非Activity中的绑定

子控件、Fragment、ListView、RecyclerView等等。这些控件都与View相关,加载布局时含有其他控件,如何绑定?
【案例】Activity中加载一个Fragment,Fragment中加载一个布局,布局中有2个按钮,如何对这两个按钮进行绑定?

fragment_my.xml

activity_main3.xml

MyFragment.java



【案例】在RecyclerView中实现绑定
绑定写在哪里?
需要创建Holder、Adapter、RecyclerView、主布局、条目布局。
主布局的绑定写入到Activity中即可。条目布局中的控件写在哪里进行绑定?
要求:
给定100个序号,以列表的形式展示100个序号。序号使用TextView显示。如何实现绑定?


item.xml



MyHolder.java

MyAdapter.java

MainActivity4.java

【拓展】如果每个按钮既有公共的逻辑,又有独特的逻辑,怎么办?
(1)识别共同逻辑,和独有逻辑
(2)共同逻辑放在公共代码区域
(3)要想执行部分,由具体的实例来决定,就需要在实例部分传入具体的实现。
(3.1)所以需要定义接口,接口约定方法签名即可。
(3.2)要添加接口方法在什么地方调用。
(3.3)接口实现,需要在执行接口前传入。需要声明一个接口变量,用来接收外界传入接口的实现类的实例。
(3.4)外界实现这个接口,并传入。
(4)当用户点击按钮时,就执行已经传入后的接口实现方法。
【项目结构】

MyButton.java




MainActivity.java

(续跟)1.绑定一组View

例如多个TextView一起绑定到一个List集合,集合是一个android资源。
使用注解@BindViews({x,y,z})
【案例】

activity_main.xml

MainActivity.java

2.绑定监听器

事件有哪些?
clickListener、SelectedItemListener等
监听器的绑定注解:

@OnClick(R.id.btn1)
public void click(View v){
}//此方法为事件发生时绑定到btn1上

【案例】

activity_main2.xml

MainActivity2.java

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

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

相关文章

【C语言】结构体内存对齐问题

1.结构体内存对齐 我们已经基本掌握了结构体的使用了。那我们现在必须得知道结构体在内存中是如何存储的?内存是如何分配的?所以我们得知道如何计算结构体的大小?这就引出了我们今天所要探讨的内容:结构体内存对齐。 1.1 对齐规…

绝地求生:七周年活动来袭,小黑盒联名限时返场

就在2024.3.20号下午18点,小黑盒绝地求生板块上线最新活动,活动方法和以往一样采用积分抽奖的方式,通过每日签到,完成任务即可获得相应积分,抽奖需消耗10积分,第一天可以抽8次,后面每一天可以抽…

利用colab部署chatglm

登录colab 创建新的notebook 选择notebook设置 选择GPU然后保存,需要选择GPU 克隆代码 !git clone https://github.com/THUDM/ChatGLM-6B.git切换到目录安装所需要的依赖 %cd /content/ChatGLM-6B %pwd !pip install -r requirements.txt安装所需要的依赖包 …

微软聘请了谷歌DeepMind的联合创始人

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

爬虫基础:Web网页基础

爬虫基础:Web网页基础 前言Web网页基础网页的组成网页的结构节点树及节点间的关系选择器 前言 用浏览器访问不同的网站时,呈现的页面各不相同,你有没有想过为何会这样呢?了解一下网页的组成、结构和节点等内容。了解这些内容有助于…

超长爬电结构法蓝底板平面(厚膜、无感设计)中功率电阻

灌封胶封装设计 厚膜无感电阻规格书 EAK特殊设计的模压灌封胶结构设计,使本产品具备超长的 爬电距离,符合VDE0160和UL94-V0的标准。 技术特点 底板中心温度≤85C时,单一电阻结构额定 功率为150W。 四种封装结构,最多封装三个电阻。 2-…

【ChatGLM3-6B】本地大模型使用方法详细教程!!!内含详细的代码解析!!

ChatGLM3介绍 ChatGLM3 是智谱AI与清华大学KEG实验室联合发布的新一代对话预训练模型。 ChatGLM3-6B 的基础模型 ChatGLM3-6B-Base 采用了更多样的训练数据、更充分的训练步数和更合理的训练策略。在语义、数学、推理、代码、知识等不同角度的数据集上测评显示,Ch…

写一个简单的 C++ 日志库 - cllogger(3)- CRT

通过上一篇 《写一个简单的 C 日志库 - cllogger(2)- 日期时间》我们已经掌握了如何通过 std::chrono 提供的日期时间工具转换时间参数为指定格式的字符串。 现在我们可以把各个参数信息拼装为 Entry 实例,交给 OutputMessage() void cllog…

PyTorch 深度学习(GPT 重译)(三)

六、使用神经网络拟合数据 本章内容包括 与线性模型相比,非线性激活函数是关键区别 使用 PyTorch 的nn模块 使用神经网络解决线性拟合问题 到目前为止,我们已经仔细研究了线性模型如何学习以及如何在 PyTorch 中实现这一点。我们专注于一个非常简单…

python爬虫学习第二天----类型转换

🎈🎈作者主页: 喔的嘛呀🎈🎈 🎈🎈所属专栏:python爬虫学习🎈🎈 ✨✨谢谢大家捧场,祝屏幕前的小伙伴们每天都有好运相伴左右,一定要天天…

Word2vec学习笔记

(1)NNLM模型(神经网络语言模型) 语言模型是一个单纯的、统一的、抽象的形式系统,语言客观事实经过语言模型的描述,比较适合于电子计算机进行自动处理,因而语言模型对于自然语言的信息处理具有重…

Python基础入门 --- 6.数据容器

文章目录 Python基础入门第六章:6.数据容器6.1 列表6.1.1 列表下标索引6.1.2 列表常用操作查找指定某元素的下标修改指定位置的元素值插入元素追加元素方式1追加元素方式2删除元素删除某元素在列表中的第一个匹配项清空列表统计某元素在列表中的数量统计列表元素个数…

【Redis】Redis常见原理和数据结构

Redis 什么是redis redis是一款基于内存的k-v数据结构的非关系型数据库,读写速度非常快,常用于缓存,消息队列、分布式锁等场景。 redis的数据类型 string:字符串 缓存对象,分布式ID,token,se…

RAGGED: Towards Informed Design of Retrieval Augmented Generation Systems阅读笔记

论文链接:https://arxiv.org/abs/2403.09040 Github链接:GitHub - neulab/ragged: Retrieval Augmented Generation Generalized Evaluation Dataset 最近RAG(retrieval-augmented generation)真的好火,这不CMU的发了…

vscode用SSH远程开发c语言

vscode配置远程 这里我使用虚拟机进行展示,首先需要你的虚拟机安装好ssh 没安装好就执行下面的命令安装并开启服务 sudo apt-get install ssh sudo service ssh start ps -e | grep sshvscode安装 remote-ssh扩展 点击左下角的远程连接,我这里已经连接…

电脑小白入门|Windows系统下只要记住这几点,你就能流畅使用!

前言 前段时间发现有很多小伙伴在使用电脑这个问题上遇到了很大的难题:到底什么时候该用鼠标左键单击、什么时候该双击;电脑的快捷键那么多怎么记得住等等的问题。 今天小白就稍微来讲解一下,这个帖子适合Windows电脑都不会使用的小伙伴。 …

流畅的 Python 第二版(GPT 重译)(四)

第二部分:函数作为对象 第七章:函数作为一等对象 我从未认为 Python 受到函数式语言的重大影响,无论人们说什么或想什么。我更熟悉命令式语言,如 C 和 Algol 68,尽管我将函数作为一等对象,但我并不认为 Py…

iframe动态操作标签分享

前言 分享一个近期工作中遇到的关于IFrame的需求,以及解决方案。 需求大致是说在我们系统中嵌套了另一个文档页面,这个文档页面是爬取的,并且页面是原先使用后端渲染实现的,取到的css和script标签都是相对路径比如: "./mia…

【文件操作和IO】

文件操作和IO 1.文件2. 硬盘上文件的目录结构3. 文件路径4. 文件重要分类:5. Java中操作文件5.1 Java对于文件操作的API5.2 Java中使用File类来进行文件操作5.3 File类属性5.4 构造方法5.5 方法: 6. 文件内容的读写 -- 文件流(数据流&#xf…

32.768K晶振X1A000141000300适用于无人驾驶汽车电子设备

科技的发展带动电子元器件的发展电子元器件-“晶振”为现代的科技带来了巨大的贡献,用小小的身体发挥着大大的能量。 近两年无人驾驶汽车热度很高,不少汽车巨头都已入局。但这项技术的难度不小,相信在未来几年里,无人驾驶汽车这项…