获取View的宽高信息

Android-面试官:View-post()-为什么能够获取到-View-的宽高-? 最后为了帮助大家深刻理解。 阅读详情


在activity中可以调用View.getWidth、View.getHeight()、View.getMeasuredWidth() 、View.getgetMeasuredHeight()来获得某个view的宽度或高度,但是在onCreate()、onStrart()、onResume()方法中会返回0,这是应为当前activity所代表的界面还没显示出来没有添加到WindowPhone的DecorView上或要获取的view没有被添加到DecorView上或者该View的visibility属性为gone 或者该view的width或height真的为0  所以只有上述条件都不成立时才能得到非0的width和height  

所以要想获取到的width和height为真实有效的 则有以下方法

1.在该View的事件回调里使用  这时候该view已经被显示即被添加到DecorView上  如点击事件  触摸事件   焦点事件等

  1. View view=findViewById(R.id.tv);  
  2.     view.setOnClickListener(new OnClickListener() {  
  3.           
  4.         @Override  
  5.         public void onClick(View v) {  
  6.             int width = v.getWidth();  
  7.         }  
  8.     });  
 View view=findViewById(R.id.tv);
    	view.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				int width = v.getWidth();
			}
		});

2.在activity被显示出来时即添加到了DecorView上时获取宽和高如onWindowFocusChanged() 回调方法

  1. @Override  
  2.   public void onWindowFocusChanged(boolean hasFocus) {  
  3.     View iv1 = findViewById(R.id.iv1);  
  4. View iv2=findViewById(R.id.iv2);  
  5. String msg1="iv1' width:"+iv1.getWidth()+" height:"+iv1.getHeight()+"  measuredWidth:"+iv1.getMeasuredWidth()+"measuredHeight:"+iv1.getMeasuredHeight();  
  6. String msg2="iv2' width:"+iv2.getWidth()+" height:"+iv2.getHeight()+"  measuredWidth:"+iv2.getMeasuredWidth()+"measuredHeight:"+iv2.getMeasuredHeight();  
  7. i("onWindowFocusChanged() "+msg1);  
  8. i("onWindowFocusChanged() "+msg2);  
  9.     super.onWindowFocusChanged(hasFocus);  
  10.   }  
  @Override
    public void onWindowFocusChanged(boolean hasFocus) {
    	View iv1 = findViewById(R.id.iv1);
		View iv2=findViewById(R.id.iv2);
		String msg1="iv1' width:"+iv1.getWidth()+" height:"+iv1.getHeight()+"  measuredWidth:"+iv1.getMeasuredWidth()+"measuredHeight:"+iv1.getMeasuredHeight();
		String msg2="iv2' width:"+iv2.getWidth()+" height:"+iv2.getHeight()+"  measuredWidth:"+iv2.getMeasuredWidth()+"measuredHeight:"+iv2.getMeasuredHeight();
		i("onWindowFocusChanged() "+msg1);
		i("onWindowFocusChanged() "+msg2);
    	super.onWindowFocusChanged(hasFocus);
    }

3.或在onResume方法最后开线程300毫秒左右后获取宽和高   因为onResume执行完后300毫秒后 界面就显示出来了  

当然地2种和地3种方法要保证获取宽高的view是在setContentView时设进去的View或它的子View

  1. view.postDelayed(new Runnable() {  
  2.               
  3.             @Override  
  4.             public void run() {  
  5.                 View iv1 = findViewById(R.id.iv1);  
  6.                 View iv2=findViewById(R.id.iv2);  
  7.                 String msg1="iv1' width:"+iv1.getWidth()+" height:"+iv1.getHeight()+"  measuredWidth:"+iv1.getMeasuredWidth()+"measuredHeight:"+iv1.getMeasuredHeight();  
  8.                 String msg2="iv2' width:"+iv2.getWidth()+" height:"+iv2.getHeight()+"  measuredWidth:"+iv2.getMeasuredWidth()+"measuredHeight:"+iv2.getMeasuredHeight();  
  9.                 i("onWindowFocusChanged() "+msg1);  
  10.                 i("onWindowFocusChanged() "+msg2);  
  11.             }  
  12.         }, 300);  
view.postDelayed(new Runnable() {
			
			@Override
			public void run() {
				View iv1 = findViewById(R.id.iv1);
				View iv2=findViewById(R.id.iv2);
				String msg1="iv1' width:"+iv1.getWidth()+" height:"+iv1.getHeight()+"  measuredWidth:"+iv1.getMeasuredWidth()+"measuredHeight:"+iv1.getMeasuredHeight();
				String msg2="iv2' width:"+iv2.getWidth()+" height:"+iv2.getHeight()+"  measuredWidth:"+iv2.getMeasuredWidth()+"measuredHeight:"+iv2.getMeasuredHeight();
				i("onWindowFocusChanged() "+msg1);
				i("onWindowFocusChanged() "+msg2);
			}
		}, 300);


4.在onCreate()或onResume()等方法中需要获取宽高时使用getViewTreeObserver().addOnGlobalLayoutListener()来添为view加回调在回调里获得宽度或者高度获取完后让view删除该回调

  1. view.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {  
  2.           
  3.         @Override  
  4.         public void onGlobalLayout() {  
  5.             view.postDelayed(new Runnable() {  
  6.                   
  7.                 @Override  
  8.                 public void run() {  
  9.                     View iv1 = findViewById(R.id.iv1);  
  10.                     View iv2=findViewById(R.id.iv2);  
  11.                     String msg1="iv1' width:"+iv1.getWidth()+" height:"+iv1.getHeight()+"  measuredWidth:"+iv1.getMeasuredWidth()+"measuredHeight:"+iv1.getMeasuredHeight();  
  12.                     String msg2="iv2' width:"+iv2.getWidth()+" height:"+iv2.getHeight()+"  measuredWidth:"+iv2.getMeasuredWidth()+"measuredHeight:"+iv2.getMeasuredHeight();  
  13.                     i("onWindowFocusChanged() "+msg1);  
  14.                     i("onWindowFocusChanged() "+msg2);  
  15.                 }  
  16.             }, 300);  
  17.         }  
  18.     });  
	view.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
			
			@Override
			public void onGlobalLayout() {
				view.postDelayed(new Runnable() {
					
					@Override
					public void run() {
						View iv1 = findViewById(R.id.iv1);
						View iv2=findViewById(R.id.iv2);
						String msg1="iv1' width:"+iv1.getWidth()+" height:"+iv1.getHeight()+"  measuredWidth:"+iv1.getMeasuredWidth()+"measuredHeight:"+iv1.getMeasuredHeight();
						String msg2="iv2' width:"+iv2.getWidth()+" height:"+iv2.getHeight()+"  measuredWidth:"+iv2.getMeasuredWidth()+"measuredHeight:"+iv2.getMeasuredHeight();
						i("onWindowFocusChanged() "+msg1);
						i("onWindowFocusChanged() "+msg2);
					}
				}, 300);
			}
		});

5.在窗口焦点发生变化时获取宽高 onResume完后就会把界面渲染到窗口上 渲染完后将执行窗口焦点花生变化回调   所以onResume到 onWindowFocusChanged为把界面渲染到窗口的时间

  1. boolean measure;  
  2.     View iv1;  
  3.     View iv2;  
  4.     @Override  
  5.     public void onWindowFocusChanged(boolean hasFocus) {  
  6.         super.onWindowFocusChanged(hasFocus);  
  7.         if(hasFocus && !measure){  
  8.             measure=true;  
  9.             measure();  
  10.         }  
  11.     }  
  12.     private void findViews(){  
  13.         iv1 = findViewById(R.id.iv1);  
  14.         iv2 =findViewById(R.id.iv2);  
  15.     }  
  16.     private void measure(){  
  17.         String msg1="iv1' width:"+iv1.getWidth()+" height:"+iv1.getHeight()+"  measuredWidth:"+iv1.getMeasuredWidth()+"measuredHeight:"+iv1.getMeasuredHeight();  
  18.         String msg2="iv2' width:"+iv2.getWidth()+" height:"+iv2.getHeight()+"  measuredWidth:"+iv2.getMeasuredWidth()+"measuredHeight:"+iv2.getMeasuredHeight();  
  19.         i("onWindowFocusChanged() "+msg1);  
  20.         i("onWindowFocusChanged() "+msg2);  
  21.     }  

Android 学习——获取某个View宽高信息的四种方法 如果我们想在activity已启动时去获取某个View的宽、高,实际上在onCreate,onStart,onResume中均无法正确得到某个View的宽高信息。因为View的measure过程和activity的生命周期方法不是同步执行的,因此无法保证Activity执行了onCreate,onStart,onResume时,某个View已经测量完毕,一旦View没有测量完毕,那么我们此时获得的... 阅读详情

相关推荐

【Mac+CLion+STM32+JLink】从零到一:在macOS上构建高效STM32开发与调试工作流

本文详细介绍了在macOS上使用CLion、STM32CubeMX和JLink搭建高效STM32开发与调试工作流的完整指南。从环境准备、CLion深度配置到STM32CubeMX工程实战,再到JLink烧录避坑和串口调试技巧,帮助开发者快速掌握Mac平台下的嵌入式开发全流程。

weixin_28278377的博客 254

Activity中获取view的高度和宽度为0的原因以及解决方案

android 获取宽和高不为零的方法

nailsoul的专栏 4万+

AWR1642+DCA1000EVM 不使用mmWave Studio软件采集原始ADC数据 Timeout问题汇总

DCA1000 EVM Timeout问题汇总

Jesy_Hsu的博客 1476

android onCreate中获取view宽高为0的多种解决方法

这个问题大家肯定遇到过不止一次,其实很简单,解决它也很容易,但是咱们追求的毕竟不是解决它,而是找到几种方法去解决,并且这么解决的原理是什么。   这里列出4种解决方案:Activity/View#onWindowFocusChanged  这个函数的含义是:view已经初始化完毕了,宽/高已经准备好了,这个时候去获取宽高是可以成功获取的。但是需要注意的是onWindowFocusChanged函数

Shawn_Dut的专栏 8939

机械臂电机力矩计算

设计 6 轴机械臂时,电机力矩计算是确保机械臂负载能力、运动精度和安全性的核心环节,需围绕和两大核心展开,结合机械臂结构参数(如关节长度、质量分布)、负载需求(如末端负载重量、惯性)和运动参数(如加速度、角速度)逐步推导。

ZPC8210的博客 1857

pytorch-cifar100学习资料汇总 - 基于PyTorch的CIFAR-100图像分类实践

pytorch-cifar100是一个基于PyTorch实现CIFAR-100数据集图像分类的开源项目。该项目实现了多种经典的深度学习网络模型,如ResNet、DenseNet、VGG等,为开发者提供了在CIFAR-100数据集上进行图像分类实验的代码范例。pytorch-cifar100项目为我们提供了在CIFAR-100数据集上进行图像分类实验的完整代码实现。无论你是想要学习PyTorch的使用,还是研究不同网络模型在CIFAR-100上的表现,这个项目都是一个很好的起点。

helloaiworld的博客 1123

Android Activity 启动时获取View的宽高为0?正确获取View宽高的方式

方法对于确保在视图完成布局后执行操作非常有用,但在处理复杂布局时需要谨慎使用,以避免引入不必要的延迟,更推荐使用下面这种。方法去获取 View 的宽高信息,会发现拿到的宽高大概率都是0。这是由于 View 很可能还未完成布局,而没有宽高信息。通过 View 的 ViewTreeObserver 添加一个监听事件,在 View 的大小完成计算后自动回调。备注:AndroidX 中可以使用。判断是否已经完成布局,即。使用 View 类的。

阿飞的博客 1072

【Godot4自学手册】第一节配置Godot运行环境

Godot是一款自由开源、由社区驱动的 2D 和 3D 游戏引擎!它是一款功能丰富的跨平台游戏引擎,可以通过统一的界面创建 2D 和 3D 游戏。它提供了一套全面的通用工具,因此用户可以专注于制作游戏,而无需重新发明轮子。游戏可以一键导出到多个平台,包括主流的桌面平台(Linux、macOS、Windows)、移动平台(Android、iOS)、基于 Web 的平台以及主机平台。

zhaoyang314的博客 5984

android获取高度为0,Android 获取 View 宽高的常用正确方式,避免为零

相信有很多朋友都有过在 Activity 中通过 getWidth() 之类的方法获取 View 的宽高值,可能在 onCreate() 生命周期方法中,也可能在 onResume() 生命周期方法中。然而,不幸的是,并不能获取所要的结果,宽高值均为 0。如果对 View 的绘制显示流程熟悉的话,就会知道问题所在。我们知道,在自定义 View 时,通常都要重写 onMeasure、onLayout...

weixin_39906130的博客 796

PCB设计必看:铜皮厚度与载流量的黄金比例(附实用对照表)

本文深入探讨了PCB设计中铜皮厚度与载流量的关键关系,提供了实用的对照表和设计技巧。通过分析基础原理、标准选择策略及常见误区,帮助工程师优化PCB设计,确保电路板的可靠性和安全性。特别适用于需要处理大电流或高频应用的电子设计场景。

milk8的博客 511

PCIe学习笔记(一)-------1.3 PCIe数据包(TLP,DLLP,PLP)

1,PCIe的层次结构 PICe设备在硬件电路上可以分为三个层次结构:事务层(Transaction Layer)、数据链路层(Data Link Layer)、物理层(Physical)。每一个层次又可以分为两个部分,分别为处理发送和处理接收的部分。 也可以分为四个层次,将事务层以上的层次称为软件层(Software Layer)。 2,PCIe数据包 前面已经说过PCIe之间是以数据包的形式来传输数据的,协议共定义了3类数据包。与处理层相关的是处理层数据包(TLP),与数据链路层相关的是数据

llxxyy507的博客 2万+

Android中怎么获取View的宽高信息

onCreate()、onResume()中都不能获取View的真实宽高,只有使用post之后才能拿到View的真实宽高。原因为:onCreate()、onResume()的时候,其实还没有走View的onMeasure()、onLayout()、onDraw()等,所以拿不到测量之后的宽高。1.写一个TextView,然后分别在onCreate()、onCreate()中post之后、onResume()等分别去获取这个TextView的宽高。

xiaokang666的博客 745

华为OD机试真题 新系统 - WIFI设备网络规划 (Java/Py/C/C++/Js/Go)

本文整理华为 OD 机试新系统机考真题库,涵盖高频考点精析与完整题目内容,提供 C 语言、Java、C++、Python、Go、JavaScript 多语言源码实现,搭配详细解题思路讲解,并支持在线 OJ 刷题练习,助力高效备考华为 OD 机试新系统。

算法大师! 2017

android 自定义控件的宽高_巧用Handler获取View控件信息

众所周知,在Android实际开发中,对于某些复杂多变的情况,控件的位置摆放、大小控制并非是xml类型的layout文件完全可以搞定的。此时,我们通常会使用Java代码来通过动态计算,将指定的控件摆放在相应的位置,并限定其大小。同样地,也需要获取某个控件的大小。 对于获取控件宽、高的方法,大家可以自行谷歌或者百度,大抵无非一下三种方法:给相应的View控件添加ViewTreeObserver回调;...

weixin_39548832的博客 286

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Android在onCreate中获取View的宽高信息、位置信息等

方法一(推荐) flMenuTop.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { ...

张雨的博客 487

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

自定义View常用的获取宽高信息

自定义View的时候经常少不了获取View的宽高信息,当然不一定是自定义View的时候才会需要获取宽高信息,其他情况下我们也会有这样的需求,获取方式和获取的时机也十分讲究.下面分别从这几个api讲起: 1.构造方法 2.onFinishInflate 3.onSizeChanged 4.onMeasure 5.onWindowFocusChanged 6.onL

Vegetable的博客 2224

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

两种方法获取View宽高信息

因为经常在Activity中的onCreate中要获取一些View的宽高信息,以往都是利用ViewTreeObserver来获取,今天看到网上一个有意思的小Demo,作者获取的宽高的方法以前从未听说过,跟大家分享一下。一:ViewTreeObserverview.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.

wjt_developer的博客 366

【android】获取某个View宽高信息的四种方法

如果我们想在activity已启动时去获取某个View的宽、高,实际上在onCreate,onStart,onResume中均无法正确得到某个View的宽高信息。因为View的measure过程和activity的生命周期方法不是同步执行的,因此无法保证Activity执行了onCreate,onStart,onResume时,某个View已经测量完毕,一旦View没有测量完毕,那么我们此时获得的...

u012714748的博客 2630

自定义view android获取宽高,自定义View获取宽高

自定义View的时候经常少不了获取View的宽高信息,当然不一定是自定义View的时候才会需要获取宽高信息,其他情况下我们也会有这样的需求,获取方式和获取的时机也十分讲究.下面分别从这几个api讲起:1.构造方法2.onFinishInflate3.onSizeChanged4.onMeasure5.onWindowFocusChanged6.onLayout7.View.getViewTreeO...

weixin_39686634的博客 1941

关于Activity中获取View宽高的那些事

关于Activity中获取View宽高的那些事   现在有一个业务需求,需要在Activity已启动的时候做一个任务,该任务需要获取某个View的宽/高。直接的想法是从Activity的onCreate或者onResume里面去获取这个View的宽/高。但是实际上在onCreate、onStart、onResume中均无法获取正确的宽/高信息。   原因在于View的Measure过程和Acti...

weixin_38196407的博客 898

解决onCreate中不能获取View宽高

在onCreate或者onResume中不能获取view 的宽高是因为:view的measure过程和activity的生命周期不是同步执行的,因此无法保证执行onCreate,onStart,onResume时某个view已经测量完毕,这里给出三个解决方案: 注意:本人简单测试了Fragment中利用view.post(runnable);不能达到效果,感兴趣的可以再试试。

qq1377399077的专栏 971

Android获取控件宽高的几种方式,Android开发面试题目

不管怎么样,不论是什么样的大小面试,要想不被面试官虐的不要不要的,只有刷爆面试题题做好全面的准备,当然除了这个还需要在平时把自己的基础打扎实,这样不论面试官怎么样一个知识点里往死里凿,你也能应付如流啊。不管怎么样,不论是什么样的大小面试,要想不被面试官虐的不要不要的,只有刷爆面试题题做好全面的准备,当然除了这个还需要在平时把自己的基础打扎实,这样不论面试官怎么样一个知识点里往死里凿,你也能应付如流啊。重写onWindowFocusChanged()方法。@param hasFocus 当前页面是否有焦点。

2401_84152738的博客 1101

Android源码流程梳理—Activity在onResume方法中为什么不能获取View宽和高?

为什么onResume方法中不可以获取View宽和高?

岁月催人老的博客 328

Android:在activity一启动就获取View的宽高

问题:在onCreate、onStart或者onResume方法中无法正确获取某个View的宽高   原因是View的measure过程和Activity的生命周期方法不是同步执行的,因此无法保证Activity执行了onCreate、onStart、onResume时某个View已经测量完毕了,如果View没有测量完毕,那么获得的宽高就是0。 这里给出以下三种方法来解决这个问题: 1. Ac

李静南的博客 468
上一篇: android获取路径
下一篇: 多个activity之间通信
android_zzj
博客等级 码龄11年 0粉丝 25原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值