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

Android 遍历界面所有的View

关于作者:CSDN内容合伙人、技术专家, 从零开始做日活千万级APP。
专注于分享各领域原创系列文章 ,擅长java后端、移动开发、商业变现、人工智能等,希望大家多多支持。

目录

  • 一、导读
  • 二、概览
  • 三、实践
  • 四、 推荐阅读

在这里插入图片描述

一、导读

我们继续总结学习,温故知新。

二、概览

本文讲述如何遍历获取页面中所有的view,并输出对应的id,textview文本内容,imageview实际大小及设置的图片大小。

可用于检测android应用中的大图。

三、实践

不多说,直接上代码,

图片大小检测思路。

    fun checkBitmapFromView(){//1、遍历activity中的各个View控件//2、获取View控件加载的Bitmap//3、对比Bitmap宽高与View宽高}

示例代码:
遍历获取所有的view,并输出相应的信息

List<View> viewList=new ArrayList<>();@Overrideprotected void onResume() {super.onResume();logoIcon.postDelayed(new Runnable() {@Overridepublic void run() {getAllViews((ViewGroup) getWindow().getDecorView());for (View view: viewList) {if(view instanceof TextView) {Log.d("xyz", view.toString());Log.d("xyz", ((TextView)view).getText().toString());} else if(view instanceof ImageView) {Log.d("xyz", view.toString());checkBitmap(view, ((ImageView)view).getDrawable());} else {Log.d("xyz", view.toString());}}}}, 3000);}
//获取所有的子view,我们这里只保存imageview及textview,用于测试private List<View> getAllViews(ViewGroup viewGroup){for(int i=0;i< viewGroup.getChildCount(); i++){View view = viewGroup.getChildAt(i);if(view instanceof ViewGroup) {getAllViews((ViewGroup) view);} else {if(view instanceof ImageView || view instanceof TextView) {viewList.add(view);}if(view.getVisibility() == View.VISIBLE) {}}}return viewList;}

ImageView大小检测

private void checkBitmap(Object thiz, Drawable drawable) {if (drawable instanceof BitmapDrawable && thiz instanceof View) {final Bitmap bitmap = ((BitmapDrawable) drawable).getBitmap();final View view = (View) thiz;int width = view.getWidth();int height = view.getHeight();if (bitmap != null) {if (width > 0 && height > 0) {// 图标宽高都大于view带下的2倍以上,则警告if (bitmap.getWidth() >= (width << 1)&& bitmap.getHeight() >= (height << 1)) {
//                        warn(bitmap.getWidth(), bitmap.getHeight(), width, height, new RuntimeException("Bitmap size too large"));}warn(bitmap.getWidth(), bitmap.getHeight(), width, height, new RuntimeException("log"));} else {final Throwable stackTrace = new RuntimeException();view.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {@Overridepublic boolean onPreDraw() {int w = view.getWidth();int h = view.getHeight();if (w > 0 && h > 0) {if (bitmap.getWidth() >= (w << 1)&& bitmap.getHeight() >= (h << 1)) {
//                                    warn(bitmap.getWidth(), bitmap.getHeight(), w, h, stackTrace);}warn(bitmap.getWidth(), bitmap.getHeight(), w, h, stackTrace);view.getViewTreeObserver().removeOnPreDrawListener(this);}return true;}});}} else {warn(bitmap.getWidth(), bitmap.getHeight(), width, height, new RuntimeException("bitmap null"));}}}private void warn(int bitmapWidth, int bitmapHeight, int viewWidth, int viewHeight, Throwable t) {String warnInfo = new StringBuilder("Bitmap info: ").append("\n real size: (").append(bitmapWidth).append(',').append(bitmapHeight).append(')').append("\n desired size: (").append(viewWidth).append(',').append(viewHeight).append(')').append("\n call stack trace: \n").append(Log.getStackTraceString(t)).append('\n').toString();Log.d("xyz", warnInfo);}

我们看下log输出

com.xxx.xxx.xxx.ImageViewFor{e292c7e VFED..C.. ........ 540,1348-900,1528 #7f0a024e app:id/bt_phone}
2023-08-23 18:28:47.956 12556-12556 xyz                com.xxx.xxx                      D  Bitmap info: real size: (144,144)desired size: (360,180)call stack trace: java.lang.RuntimeException: logat com.xxx.xxx.ui.LoginActivity.checkBitmap(LoginActivity.java:235)at com.xxx.xxx.ui.LoginActivity.access$100(LoginActivity.java:79)at com.xxx.xxx.ui.LoginActivity$2.run(LoginActivity.java:193)at android.os.Handler.handleCallback(Handler.java:900)at android.os.Handler.dispatchMessage(Handler.java:103)at android.os.Looper.loop(Looper.java:219)at android.app.ActivityThread.main(ActivityThread.java:8673)at java.lang.reflect.Method.invoke(Native Method)at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:513)at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1109)

四、 推荐阅读

Java 专栏

SQL 专栏

数据结构与算法

Android学习专栏

ddd

相关文章:

Android 遍历界面所有的View

关于作者&#xff1a;CSDN内容合伙人、技术专家&#xff0c; 从零开始做日活千万级APP。 专注于分享各领域原创系列文章 &#xff0c;擅长java后端、移动开发、商业变现、人工智能等&#xff0c;希望大家多多支持。 目录 一、导读二、概览三、实践四、 推荐阅读 一、导读 我们…...

建筑能源管理(1)——建筑能源管理的概念

1、什么是建筑能源管理 目前&#xff0c;主要有三种不同的类型能源管理&#xff1a; (1)节约型能源管理 又称“减少能耗型”能源管理。这种管理方式着眼于能耗数量上的减少&#xff0c;采取限制用能的措施。例如&#xff0c;在非人流高峰时段停开部分电梯、在室外气温特别高时…...

SpringSecurity

明文存储密码&#xff0c;前加{noop}...

C++ vector模拟实现

目录 一.默认成员函数 二.扩容相关函数 三.[]重载 四.修改函数 五.迭代器 继上次写完string之后&#xff0c;可以写一个vector练练手以及熟悉其底层。vector是一个顺序表&#xff0c;相比普通数组不同点在于顺序表的数据必须是连续存放的。 一.默认成员函数 string是只存放字符…...

BUUCTF:[GYCTF2020]FlaskApp

Flask的网站&#xff0c;这里的功能是Base64编码解码&#xff0c;并输出 并且是存在SSTI的 /hint 提示PIN码 既然提示PIN&#xff0c;那应该是开启了Debug模式的&#xff0c;解密栏那里随便输入点什么报错看看&#xff0c;直接报错了&#xff0c;并且该Flask开启了Debug模式&am…...

好玩的调度技术

好玩的调度技术 文章目录 好玩的调度技术前言一、乱金柝-空间剥离二、拖拽编辑三、全端兼容 前言 最近感觉自己抑郁了&#xff0c;生态技术实在太庞大太复杂&#xff0c;所以我决定先停一段时间&#xff0c;在停下写生态的这两天写了几个调度的小玩意换换脑子&#xff0c;很有…...

Android 自定义加解密播放音视频(m3u8独立加密)

文章目录 背景加密流程音视频解密音视频播放结语 背景 当涉及App内部视频的时候&#xff0c;我们不希望被别人以抓包的形式来爬取我们的视频大视频文件以文件方式整个加密的话需要完全下载后才能进行解密当前m3u8格式虽然支持加密&#xff0c;但是ts格式的小视频可以独立播放的…...

常见的文件格式

一、C:\fakepath\新建文本文档.txt [object String] 实现方式&#xff1a; <input onchange"test(this.value)" type"file"></input><script>function test(e){console.log(e,Object.prototype.toString.call(e))}</script> 二、…...

浏览器输入url后回车展开过程

当你在浏览器中输入一个URL并敲下回车后&#xff0c;浏览器会执行一系列步骤来访问并展示网页。下面是浏览器访问网页的一般流程&#xff1a; DNS解析&#xff1a;浏览器首先会提取URL中的主机名&#xff0c;然后向DNS服务器发送请求&#xff0c;将主机名解析为对应的IP地址。这…...

Docker 容器创建命令说明

使用命令如下: docker run -itd --name=cluster -v /home/ClusterApp/cluster:/home/ClusterApp/cluster --restart=always --privileged=true -p 12000:12000 python:3.8 命令说明: docker run 创建一个容器并运行 docker run --help 可以查看所有的参数: 命令中参数说明 -…...

西瓜书读书笔记整理(六)—— 第六章 支持向量机

第六章 支持向量机 6.1 间隔与支持向量6.1.1 什么是支持向量机6.1.2 支持向量与间隔6.1.3 支持向量机的求解过程 6.2 对偶问题&#xff08;dual problem&#xff09;6.2.1 什么是对偶问题6.2.2 如何求解支持向量机的对偶问题 6.3 核函数&#xff08;kernel function&#xff09…...

蓝桥杯每日一题2023.9.23

4961. 整数删除 - AcWing题库 题目描述 分析 注&#xff1a;如果要进行大量的删除操作可以使用链表 动态求最小值使用堆&#xff0c;每次从堆中取出最小值的下标然后在链表中删除 注意long long 代码解释&#xff1a; while(k --){auto t q.top();q.pop();res t.first;i…...

C语言数组和指针笔试题(三)(一定要看)

目录 字符数组四例题1例题2例题3例题4例题5例题6例题7 结果字符数组五例题1例题2例题3例题4例题5例题6例题7结果字符数组六例题1例题2例题3例题4例题5例题6例题7 结果 感谢各位大佬对我的支持,如果我的文章对你有用,欢迎点击以下链接 &#x1f412;&#x1f412;&#x1f412;个…...

leetcode11 盛水最多的容器

题目 给定一个长度为 n 的整数数组 height 。有 n 条垂线&#xff0c;第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 找出其中的两条线&#xff0c;使得它们与 x 轴共同构成的容器可以容纳最多的水。 返回容器可以储存的最大水量。 示例 输入&#xff1a;[1,8,6,2,5,4,8,…...

进入数据结构的世界

数据结构和算法的概述 一、什么是数据结构二、什么是算法三、如何去学习数据结构和算法四、算法的时间复杂度和空间复杂度4.1 算法效率4.2 大O的渐进表示法4.3 时间复杂度4.4 空间复杂度4.5 常见复杂度对比 一、什么是数据结构 数据结构是计算机存储、组织数据的方式。&#x…...

stm32之看门狗

STM32 有两个看门狗&#xff0c;独立看门狗和窗口看门狗&#xff0c;独立看门狗又称宠物狗&#xff0c;窗 口看门狗又称警犬。可用来检测和解决由软件错误引起的故障。两个看门狗的原理都是当计数器达到给定的超时值时&#xff0c;产生系统复位&#xff0c;对于窗口型看门狗同…...

纤维蛋白单体(FM)介绍

纤维蛋白单体&#xff08;FM&#xff09;是血栓形成的早期产物&#xff0c;是纤维蛋白原&#xff08;Fibrinogen&#xff0c;Fbg&#xff09;在凝血酶&#xff08;Thrombin&#xff09;的作用下&#xff0c;脱掉肽A&#xff08;Fibrinopeptide A&#xff0c;Fp A&#xff09;与…...

知识图谱实战导论:从什么是KG到LLM与KG/DB的结合实战

前言 本文侧重讲解&#xff1a; 什么是知识图谱LLM与langchain/数据库/知识图谱的结合应用 比如&#xff0c;虽说基于知识图谱的问答 早在2019年之前就有很多研究了&#xff0c;但谁会想到今年KBQA因为LLM如此突飞猛进呢 第一部分 知识图谱入门导论 //待更.. 第二部分 LLM与…...

第5章 会话与会话技术

第5章 会话与会话技术 一. 单选题&#xff08;共5题&#xff0c;50分&#xff09;二. 判断题&#xff08;共5题&#xff0c;50分&#xff09; 一. 单选题&#xff08;共5题&#xff0c;50分&#xff09; (单选题) 阅读下面代码&#xff1a; Book book BookDB.getBook(id)…...

IDEA2023新UI回退老UI

idea2023年发布了新UI&#xff0c;如下所示 但是用起来真心不好用&#xff0c;各种位置也是错乱&#xff0c;用下面方法可以回退老UI...

毕设成品 深度学习安全帽佩戴检测(源码+论文)

文章目录 0 前言&#x1f525;这两年开始毕业设计和毕业答辩的要求和难度不断提升&#xff0c;传统的毕设题目缺少创新和亮点&#xff0c;往往达不到毕业答辩的要求&#xff0c;这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。为了大家能够顺利以及最少的精力…...

芯片验证工程师的思维模式:从职业本能到生活与管理的利器

1. 从“找茬”到“共生”&#xff1a;一位芯片验证工程师的职业心路 “今天又抓了几个bug&#xff1f;” 这可能是我们验证工程师之间最常听到的问候语&#xff0c;其频率仅次于“咖啡机在哪”。十多年前&#xff0c;当我读到那篇关于“Bug是否侵扰了生活”的专栏时&#xff0…...

初次使用Taotoken模型广场进行选型与切换的直观体验

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 初次使用Taotoken模型广场进行选型与切换的直观体验 对于开发者而言&#xff0c;接入大模型API后&#xff0c;面对的第一个现实问题…...

无人机、自动驾驶如何搞定GNSS模糊度?快速固定技巧与RTKLib实战

无人机与自动驾驶中的GNSS模糊度快速固定&#xff1a;RTKLib实战指南 在动态环境中实现厘米级定位的关键&#xff0c;往往取决于GNSS信号中整周模糊度的快速准确固定。对于无人机飞控开发者而言&#xff0c;模糊度固定速度直接关系到飞行轨迹的平滑性&#xff1b;自动驾驶工程师…...

从零打造蒸汽朋克辉光管时钟:驱动方案、定制管与系统集成实战

1. 项目概述&#xff1a;从零开始的蒸汽朋克辉光管时钟作为一个在电子制作和复古硬件领域折腾了十多年的老玩家&#xff0c;我始终对那些散发着温暖橘红色光芒的辉光管&#xff08;Nixie Tube&#xff09;情有独钟。它们不仅仅是时间的显示器&#xff0c;更像是一件连接过去与未…...

2026免费照片去水印软件App排行榜,手机电脑去水印哪款好用?实测推荐

2026免费照片去水印软件App排行榜&#xff0c;手机电脑去水印哪款好用&#xff1f;实测推荐 图片上的水印去不掉&#xff0c;一直是不少人的痛点。从社交平台保存下来的图片带着平台Logo&#xff0c;下载的素材图带有版权标识&#xff0c;或者照片里不小心拍到广告文字——这些…...

微型环境传感器技术:PM2.5与VOC检测的突破与应用

1. 个人空气质量监测的技术革命在深圳的一个典型工作日早晨&#xff0c;张工程师像往常一样准备出门上班。他习惯性地查看手机上的空气质量指数&#xff0c;发现室外PM2.5数值高达85μg/m&#xff08;超过WHO安全标准3倍以上&#xff09;。犹豫片刻后&#xff0c;他戴上了N95口…...

让Linux桌面工作流更高效:Sticky便签应用深度解析

让Linux桌面工作流更高效&#xff1a;Sticky便签应用深度解析 【免费下载链接】sticky A sticky notes app for the linux desktop 项目地址: https://gitcode.com/gh_mirrors/stic/sticky 在Linux桌面环境中&#xff0c;快速记录和访问临时信息是每个用户都会遇到的日常…...

别再死记硬背截止、放大、饱和了!用Arduino+面包板,5分钟直观演示三极管三种工作状态

用Arduino实战破解三极管工作状态的秘密 记得第一次学三极管时&#xff0c;盯着课本上那些截止区、放大区、饱和区的曲线图&#xff0c;我完全无法理解这些抽象概念和实际电路有什么关系。直到有一天&#xff0c;我在实验室里用Arduino和几个简单元件搭建了一个测试电路&#x…...

终极指南:用WarcraftHelper彻底解决魔兽争霸III现代系统兼容性问题

终极指南&#xff1a;用WarcraftHelper彻底解决魔兽争霸III现代系统兼容性问题 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 还在为魔兽争霸III在Wi…...